为什么JAVA进程占用内存会超过Xmx设置

JVM内存区域总体分两类,heap区 和 非heap 区(本地内存) 。 
- heap区: 堆区分为Young Gen(新生代),Tenured Gen(老年代-养老区)。其中新生代又分为Eden Space(伊甸园)、Survivor Space(幸存者区)。 
- 非heap区: Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。

首先JVM本身是一个应用程序,一般是通过C、C++实现的,这个应用程序要正常运行,是一定要向操作系统申请内存的,维持这个进程正常运行的内存,即可以理解成本地内存。 

其次,Java程序在运行过程中,会new出很多对象,这些对象又是保存在JVM的堆内存中的,Java程序在执行过程中,会加载很多类,这些类也是保存在堆内存中。 

JVM本身要对堆内存进行维护和管理,还负责垃圾回收,这些也同时会消耗本地内存,JVM在启动过程中,会依赖一些动态库,这同样也消耗本地内存。 

JAVA_OPTS='-Xms3096m -Xmx3096m -Dsun.net.inetaddr.ttl=180' 这个只是用于设置堆内存的大小,而JVM运行过程中到底会向操作系统申请多少内存,这个是由JVM在运行过程中动态决定的,我们无法设置

Xmx设置的是最大可用的堆内存

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/83341882