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中被彻底移除)

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