美文网首页
JVM 堆内存初步认识

JVM 堆内存初步认识

作者: zhy0324 | 来源:发表于2020-09-10 15:14 被阅读0次

堆内存,是JVM运行时一块最大的内存,几乎所有的对象都分配在堆内存中。为什么说是几乎,因为有的对象会分配到栈上,例如:
1、在方法中创建的基本数据类型对象分配在栈上
2、经过逃逸分析发现只会在方法内部引用的小对象(因为栈的大小在通常情况下默认是1M)分配在栈上
JVM在启动时就会去向物理机申请内存,当然申请的大小是可以通过启动参数控制的

-Xms:堆的最小值;
-Xmx:堆的最大值;
-Xmn:新生代的大小;
-XX:NewSize;新生代最小值;
-XX:MaxNewSize:新生代最大值;

从参数里也可以看到新生代几个字,这就是堆内存分代设置。看看堆内存的示意图就明白了:


解释一下:
新生代 = Eden + From + To;在默认情况下,新生代占了堆内存的1/3,而且Eden : From : To 为 8 : 1 : 1。
老年代 = Tenured;在默认情况下,老年代占了堆内存的2/3
为什么要这么划分堆内存,是JVM进过不断的演变得到的结果,需要详细解释堆内存划分,就需要结合:对象的内存分配知识、JVM的垃圾回收器等两方面去深入理解JVM对堆内存的操作。

ps:还有一个问题,其实堆内存并不是全部用来分配给了 新生代和老年代,其实堆内存还有一部分被其他的元素占用了,例如从JDK1.7以后,运行时常量池、字符串常量池的具体位置就被分配到了堆中,虽然他们逻辑上还是属于方法区的一部分。

相关文章

网友评论

      本文标题:JVM 堆内存初步认识

      本文链接:https://www.haomeiwen.com/subject/spspektx.html