版权声明:欢迎转载 https://blog.csdn.net/weixin_33387378/article/details/88226047
1.JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
3.Java 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%以上),所以年轻代的垃圾回收算法使用的是复制算法,
复制算法的基本思想是将内存分为两块,每次只有其中一块,当这一块内存使用完,就将还活着的对象复制到
另一块上面。复制算法不会产生内存碎片