二、Jvm运行时内存(jvm堆)
(1)新生代:
jvm新创建对象(除大对象外)会被放入新生代,jvm会频繁创建对象,所以新生代区数据量打,且对象不稳定可以被回收的对象多。则会频繁触发新生代的MinorGc进行回收垃圾。
- Eden区:java创建对象时首先会被存放在Eden区,如果对象属于大对象,则直接放入老年代中。
- ServivorTo区:保留上一次MinorGc时的幸存者
- ServivorFrom区:将上一次的幸存者作为这一次的被扫描者,操作就是将ServivorTo内容复制到 ServivorFrom区
特点:新生代垃圾回收过程叫做MinorGc,采用复制算法实现
每进行一次MinorGc回收存活的对象都会被+1,直到15(系统默认15)后将该对象放入老年代中。
(2)老年代:
老年代主要存放长生命周期,大对象。采用**MajorGC**
对象比较稳定,MajorGC不会被频繁触发。
MajorGC采用标记清除算法。
老年代空间不足时会抛出Out of Memory异常
(3)永久代
永久代指内存的永久保存区,主要存放Class文件和Mate(元数据)的信息。Class类在加载时被放入永久代。
Gc不会在程序运行期间对永久代进行清理
所以在加载Class类过多时会抛出 Out Of Memory 异常
在Java8中,jvm将类的元数据放入本地没存,将常量池和静态变量放入Java方法区中。