JVM堆内存管理与自定义分配参数详解

Posted jpfss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM堆内存管理与自定义分配参数详解相关的知识,希望对你有一定的参考价值。

堆内存模型:

 

技术图片

在Java中,堆被划分成两个不同的区域:新生代(Young),老年代(Old)。而Permanent属于永久代(方法区),不属于堆内存。新生代又被分为了三个区域:Eden,from  survivor,to survivor。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收。

从图中可以看出: 堆大小=新生代+老年代,默认的,新生代与老年代的比例为1:2(该值可以通过参数-XX:NewRatio指定),即:新生代=1/3堆空间大小,老年代=2/3堆空间大小,其中新生代被细分为Eden何两个Survivor区域,这两个Survivor命名为from和to。默认比例 eden:from:to = 8:1:1,JVM每次只会使用Edem和一块survivor区域来为对象服务,所以无论何时,总有一块survivor是空闲的,因此新生代实际使用内存空间只有90%的新生代空间。

通常我们会根据实际情况(服务器内存大小)对堆内存大小进行调优,内存参数含义如下:

-Xmx    java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4;

-Xms    java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64;

开发过程中,通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。

 -XX:NewSize     新生代初始内存的大小,应该小于-Xms的值;

-XX:NewRatio    Yong 和 Old的比例,比如值为2,则Old是Yong的2倍,即Yong Generation占据内存的1/3;

-XX:Maxnewsize     Yong的最大值大小;

-Xmn    对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn;

-XX:Surviorratio     Eden和一个Suivior的比例,比如值为5,即Eden是To(S2)的比例是5,(From和To是一样大的),此时Eden占据Yong Generation的5/7

java虚拟机对非堆区内存配置的两个参数:
-XX:PermSize    非堆区初始内存分配大小(方法区)
-XX:MaxPermSize    对非堆区分配的内存的最大上限(方法区)。

 

原文地址:https://blog.csdn.net/u013967628/article/details/84527815

以上是关于JVM堆内存管理与自定义分配参数详解的主要内容,如果未能解决你的问题,请参考以下文章

Java——JVM内存详解

JVM是如何分配管理内存的?

JVM08_堆

JVM堆内存默认是怎么分配的?

性能测试三十四:jvm内存结构(栈堆永久代)

java_opts 参数与JVM内存调优