[讨论] jvm内存的释放
苏亮亮
2012-07-17
我现在有一个应用jvm的参数配置
-Xmx2048m -Xmx2048m 在程序运行过程中通过top和ps aux命令查看该进程占用操作系统的物理内存都是2g左右。 但是当我程序跑完进入睡眠状态的时候,通过jmap查看heap的内存也都下降了。可是为什么通过top和ps aux命令查看该进程占用操作系统的物理内存还都是2g左右?? 比如说,当Heap占用内存将近124M时,Wndows任务管理器中java进程的内存为187M,当GC过后,显示的Heap内存占用为34M,而非Heap内存占用为36M,这两者加起来才70M,而Wndows任务管理器中java进程的内存仍然为187M,那么这100M左右的内存是分配到哪了呢? jvm占用了内存之后不会在还给操作系统吗,如果我设置-Xms128m -Xmx2048m 那进程所占用的物理内存还会下降吗 |
|
chong_zh
2012-07-18
as far as my knowledge:
引用 我现在有一个应用jvm的参数配置 -Xmx2048m -Xmx2048m 在程序运行过程中通过top和ps aux命令查看该进程占用操作系统的物理内存都是2g左右。 但是当我程序跑完进入睡眠状态的时候,通过jmap查看heap的内存也都下降了。可是为什么通过top和ps aux命令查看该进程占用操作系统的物理内存还都是2g左右?? 比如说,当Heap占用内存将近124M时,Wndows任务管理器中java进程的内存为187M,当GC过后,显示的Heap内存占用为34M,而非Heap内存占用为36M,这两者加起来才70M,而Wndows任务管理器中java进程的内存仍然为187M,那么这100M左右的内存是分配到哪了呢? 用jmap等工具观察到的是java堆分配给对象使用的情况,空闲是指没有分配给任何对象,虚拟机内部的空闲,虚拟机并没有把这一部分内存还给内核 引用 jvm占用了内存之后不会在还给操作系统吗,如果我设置-Xms128m -Xmx2048m 那进程所占用的物理内存还会下降吗 我认为不会。 影响虚拟机向内核申请内存大小的是最大堆设置,最小堆设置只影响虚拟机内部的内存管理策略,即:虚拟机内java堆上内存分配时,首先在最小堆范围内分配,内存不够时gc,再不够时才扩展java堆 |
|
rockyfxl
2012-07-18
jvm 不会把内存还给OS, 因为很可能马上又要分配给新的对象,每次向 OS 申请内存是很慢的。
jvm中有两个参数 MaxHeapFreeRatio, MinHeapFreeRatio 可以收缩堆,还内存给OS, 但只在client 模式下有效,而且是分次返还,0% on the first call, 10% on the second call, 40%, on the third call, and 100% by the fourth call. 例如: java -client -verbose -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx100m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=30 |
|
wangdf_jee
2012-08-14
-Xmx2048m -Xmx2048m
此设置一次性申请了最大内存空间,jvm会一直占用. 这种设置方法是为了让jvm全额高效率工作 |