对象实例化过程的内存分配

对象实例化过程的内存分配
文章图片
JVM(Java Virtual Machine)Java虚拟机。
在学习jvm内存结构的时候,了解jvm的内存管理,能够按照自己的理解表达出实例化一个对象时jvm内存分配的过程,可以帮助更好的理解和记忆jvm的内存结构。
1. 内存申请的过程
对象实例化过程的内存分配
文章图片
Heap Java对象所占用的内存 主要是从中进行分配。堆内存是JVM中最大的一块,由年轻代和老年代组成。年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配。对象实例化时内存申请的过程如下:
1. JVM会试图为相关Java对象在Eden中初始化一块内存区域;
2. 当Eden空间足够时,内存申请结束。否则到下一步;
3. JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
4. Survivor区被用来作为Eden及old的中间交换区域,当old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
5. 当old区空间不够时,JVM会在old区进行major collection;
6. 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory error"。

1. 对象优先在EDEN分配
2. 大对象直接进入老年代
3. 长期存活的对象将进入老年代
4. 适龄对象也可能进入老年代:动态对象年龄判断
2. 常用参数配置
参数名 :说明
-Xms:初始堆大小。如:-Xms256m
【对象实例化过程的内存分配】-Xmx:最大堆大小。如:-Xmx512m
-Xmn:新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
-Xss:设置每个线程的堆栈大小。JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
-XX:NewRatio:新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3
-XX:SurvivorRatio:新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10
-XX:+PrintGCDetails:打印 GC 信息
-XX:PermSize/-XX:MaxPermSize:永久代(方法区)的初始大小/最大值 (永久代在Java8中被彻底移除)


有出错地方欢迎各位大神评论指正。

    推荐阅读