jvm垃圾回收相关收集

版权声明:欢迎转载 https://blog.csdn.net/weixin_33387378/article/details/88226047

1.JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)

2.垃圾回收 什么时候触发GC?

3.Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

4.Jvm 内存浅析 及 GC个人学习总结

1.图解

 

 

2.JDK8永久代的废弃持久带

PermGen----->替换为Metaspace(本地内存中)

3.三种模型HotSpot JVM

1.新生代:Eden+From Survivor+To Survivor

2.老年代:OldGen

3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)

4.为什么废弃永久代(PermGen)

由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen

1. Class的大小无法控制,无法设定permGen 的大小,太小了,容易溢出,太大了,JVM内存浪费,也容易导致堆内存可用空间少,导致老年代溢出

2.字符串存放在永久代,容易导致内存溢出

3. 提高了FullGC性能,Metadata 到Metadatapointer之间不用扫描

5.怎么避免频繁GC

1. 不要频繁的new 对象

2. 不要显示的调研system.gc()

3. 不要用String+ 使用StringBuilder

4.不要使用Long Integer 尽量使用基本类型

5.少用静态变量 不会回收

6.可以使用null 进行回收

6.在什么时候

首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代

中又分为1个eden区和两个Survior区域。

一般情况下,新创建的对象都会被分配到eden区,这些对象经过一个minor gc后仍然存活将会被移动到

Survior区域中,对象在Survior中没熬过一个Minor GC,年龄就会增加一岁,当他的年龄到达一定程度时,

就会被移动到老年代中。

当eden区满时,还存活的对象将被复制到survior区,当一个survior区满时,此区域的存活对象将被复制到另外一个

survior区,当另外一个也满了的时候,从前一个Survior区复制过来的并且此时还存活的对象,将可能被复制到老年代

因为年轻代中的对象基本都是朝生夕死(80%以上),所以年轻代的垃圾回收算法使用的是复制算法,

复制算法的基本思想是将内存分为两块,每次只有其中一块,当这一块内存使用完,就将还活着的对象复制到

另一块上面。复制算法不会产生内存碎片

猜你喜欢

转载自blog.csdn.net/weixin_33387378/article/details/88226047