h5必备网站,商城类网站建设,公司有域名了怎么设计网页,淘宝seo是指新生代分为三个区域#xff0c;一个Eden区和两个Survivor区#xff0c;它们之间的比例为#xff08;8#xff1a;1#xff1a;1#xff09;#xff0c;这个比例也是可以修改的。通常情况下#xff0c;对象主要分配在新生代的Eden区上#xff0c;少数情况下也可能会直接…新生代分为三个区域一个Eden区和两个Survivor区它们之间的比例为811这个比例也是可以修改的。通常情况下对象主要分配在新生代的Eden区上少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其中一块SurvivorFrom在经过一次Minor GC后将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor空间上这里使用的复制算法进行GC最后清理掉Eden和刚才用过的SurvivorFrom空间。将此时在Survivor空间存活下来的对象的年龄设置为1以后这些对象每在Survivor区熬过一次GC它们的年龄就加1当对象年龄达到某个年龄默认值为15时就会把它们移到老年代中。
在新生代中进行GC时有可能遇到另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象这些对象将直接通过分配担保机制进入老年代
1.Eden区 Eden区位于Java堆的年轻代是新对象分配内存的地方由于堆是所有线程共享的因此在堆上分配内存需要加锁。而Sun JDK为提升效率会为每个新建的线程在Eden上分配一块独立的空间由该线程独享这块空间称为TLABThread Local Allocation Buffer。在TLAB上分配内存不需要加锁因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完则仍然在堆上进行分配。如果Eden区内存也用完了则会进行一次Minor GCyoung GC。 2.Survival from to Survival区与Eden区相同都在Java堆的年轻代。Survival区有两块一块称为from区另一块为to区这两个区是相对的在发生一次Minor GC后from区就会和to区互换。在发生Minor GC时Eden区和Survivalfrom区会把一些仍然存活的对象复制进Survival to区并清除内存。Survival to区会把一些存活得足够旧的对象移至年老代。 3.年老代 年老代里存放的都是存活时间较久的大小较大的对象因此年老代使用标记整理算法。当年老代容量满的时候会触发一次Major GCfull GC回收年老代和年轻代中不再被使用的对象资源。 总结
1、Minor GC是发生在新生代中的垃圾收集采用的复制算法
2、新生代中每次使用的空间不超过90%主要用来存放新生的对象
3、Minor GC每次收集后Eden区和一块Survivor区都被清空
4、老年代中使用Full GC采用的标记-清除算法 注意
堆新生代老年代不包括永久代方法区。
很多人认为方法区或者HotSpot虚拟机中的永久代是没有垃圾收集的Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集而且在方法区进行垃圾收集的“性价比”一般比较低在堆中尤其是在新生代中常规应用进行一次垃圾收集一般可以回收70%~95%的空间而永久代的垃圾收集效率远低于此。
永久代的垃圾收集主要回收两部分内容废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似。以常量池中字面量的回收为例假如一个字符串“abc”已经进入了常量池中但是当前系统没有任何一个String对象是叫做“abc”的换句话说是没有任何String对象引用常量池中的“abc”常量也没有其他地方引用了这个字面量如果在这时候发生内存回收而且必要的话这个“abc”常量就会被系统“请”出常量池。常量池中的其他类接口、方法、字段的符号引用也与此类似。
判定一个常量是否是“废弃常量”比较简单而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面3个条件才能算是“无用的类”
该类所有的实例都已经被回收也就是Java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class 对象没有在任何地方被引用无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述3个条件的无用类进行回收这里说的仅仅是“可以”而不是和对象一样不使用了就必然会回收。是否对类进行回收HotSpot虚拟机提供了-Xnoclassgc参数进行控制还可以使用-verbose:class及-XX:TraceClassLoading、 -XX:TraceClassUnLoading查看类的加载和卸载信息。
在大量使用反射、动态代理、CGLib等bytecode框架的场景以及动态生成JSP和OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能以保证永久代不会溢出。
转发:https://blog.csdn.net/iechenyb/article/details/79424974