2)safePoint安全点可以挂起线程,防止线程无限运行,一般位于循环末尾(防止大循环)、方法返回前、调用方法的call之后、抛出异常的位置。
3)safepoint只能处理一些正在运行的线程,对于一些sleep()或block()的线程会被添加到safe region区域。标记safe region。当它被唤醒时,应该先检查GC是否完成操作。
4)GC的时候,所有进入safepoint的线程会在一个Thread.lock锁阻塞,直到当JVM的GC完成操作,JVM释放锁,阻塞的JAVA线程才能运行。
5)GC线程:这些线程支持JVM中不同的垃圾回收活动。
6)对象的回收:对象、数组存放在JVM堆中,分为新生代和老年代。新生代分为三个区,一个Eden、两个survivor,对象创建之后存在Eden(容量很大的对象可以创建到老年代)。新生代会执行MinorGC,98%的对象会被回收,不被回收的对象转移(复制算法)到一个survivor中,然后等待下一次MinorGC,GC之后Eden剩下的对象和survivor中的对象都被转移到另一个servivor中,对象就在两个survivor中不断转换。直到经历15次MinorGC才能进入老年代(old)。old中会执行FullGC,但比MinorGC的执行频率要低很多。FullGC一般耗时为MinorGC的22.89倍。新生代一般18M,老年代一般42M。
7)垃圾回收由新生代和年长代协作,称为分代回收,分别采用复制算法和标记整理算法。
复制算法:两个区域A和B,初始化对象在A,继续存活的对象被转移到另一个区。用在新生代的回收上。新生代分为一个Eden、两个survivor区。
标记整理算法:一块区域,对所有的对象进行标记(可达性标记),然后回收不可达对象,因为不是复制转移算法,所以会出现碎片。整理算法可以将碎片空间进行整理,整理出更大的内存空间存放更大的独享。
7)对象的回收机制:当前对象是否回收,主要是采用可达性分析,如果不可达,会进行一个F-Queue队列之中,在finalize方法执行过程中,会进行第二次标记是否可达,选择自救还是回收。垃圾回收线程在jvm中优先级相当的低。
8)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些不能控制,-->可通过system.gc()来建议gc回收。垃圾回收只是回收不再被使用的JVM内存,与内存是否溢出没有直接关系。
9)真正宣布一个对象死亡:第一次标记-->调用finalize方法-->第二次gc回收。
10)各版本的垃圾回收器:
单线程收集器,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它搜集结束。
多线程收集器,
jdk1.3 Serial New收集器:针对新生代,单线程收集器(使用复制收集算法)
jdk1.4 Parallel New收集器:并行回收,多线程收集器(新生代和年长代采用不同的算法)。
jdk1.4 Paraller Scavenge:并行,新生代多线程,吞吐量最大化,精确控制吞吐量。吞吐量=运行用户代码/CPU运行时间(用户代码+垃圾回收)
jdk1.5 CMS(Concurrent Mark Sweep)目标:最短回收停顿时间。(标记-清除)
jdk1.5 Serial Old老年代版本,它同样是一个单线程收集器,(使用标记整理算法)
jdk1.6 Parallel Old并行,注重吞吐量以及CPU资源敏感的场合,可以优先考虑ParallelScavenge+Parallel Old收集器组合。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66099-8.html
----
不管是老旧舰还是新锐舰或航母舰
相聚是缘那分别也是一种缘分吧
你家赵薇呢