linux应用实际内存大于 jvm xmx
文章来源: http://www.cnblogs.com/guozp/p/7845605.html
1、虽然你jvm参数设置了-Xms6g -Xmx6g,但操作系统不并会马上分配6G的物理内存,而是确实要使用了才分配。所以就内存使用率在应用启动的时候,就相对较低,后续会出现攀爬现象。
2、为什么我们系统进程占用的物理内存(Res/Rss)会远远大于设置的Xmx值,比如Xmx设置1.7G,但是top看到的Res的值却达到了3.0G?
-Xms :初始堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx :最大堆大小
以上配置只用于指定Java heap的大小,不包括持久代,也不包括CodeCache和堆外内存,JVM本身,还有一些其他内存也不会算在内等,你看的“占用内存量”是进程的private working set,这包括该进程所有独占(不与其它进程共享)的内存,不只是Java heap,因此理论上我们看到物理内存大于Xmx也是可能的,不过超过太多估计就可能有问题了。
或者这么理解:
JVM的内存分为两部分,本地内存+Heap内存(Java程序在运行过程中的对象是保存在JVM的堆内存中的) ,首先JVM本身是一个应用程序,一般是通过C、C++实现的,这个程序要运行,是一定要向操作系统申请内存的,维持这个进程正常运行的内存,即可以理解成本地内存。
JVM本身要对堆内存进行维护和管理,还负责垃圾回收,这些也同时会消耗本地内存,JVM在启动过程中,会依赖一些动态库,这同样也消耗本地内存。
-Xmx 这个只是用于设置堆内存的大小,而JVM运行过程中到底会向操作系统申请多少内存,这个是由JVM在运行过程中动态决定的,我们无法设置
文章来源: http://www.cnblogs.com/guozp/p/7845605.html