作者回复: 赞,Region这块 Jxin讲解的通俗易懂。
作者回复: Liam提出的这两个问题非常好。
1、不管什么GC,都会发送stop the world,区别是发生的时间长短。而这个时间跟垃圾收集器又有关系,Serial、PartNew、Parallel Scavenge收集器无论是串行还是并行,都会挂起用户线程,而CMS和G1在并发标记时,是不会挂起用户线程,但其他时候一样会挂起用户线程,stop the world的时间相对来说小很多了。
2、major gc很多参考资料指的是等价于full gc,我们也可以发现很多性能监测工具中只有minor gc和full gc。
一般情况下,一次full gc将会对年轻代、老年代以及元空间、堆外内存进行垃圾回收。而触发Full GC的原因有很多:
a、当年轻代晋升到老年代的对象大小比目前老年代剩余的空间大小还要大时,此时会触发Full GC;
b、当老年代的空间使用率超过某阈值时,此时会触发Full GC;
c、当元空间不足时(JDK1.7永久代不足),也会触发Full GC;
d、当调用System.gc()也会安排一次Full GC;
作者回复: 赞。
理解G1中的几个重要概念:Region、SATB、RSet以及Pause Prediction Model,能更好的理解G1相对CMS的一些具体优势在哪里了。
作者回复: 需要根据具体的业务来分析,正常小对象且请求平缓的应用服务中,几天一次较为正常。如果有大量大对象创建或者承受高并发场景的服务,Full GC可能会更频繁。
作者回复: 在Java语言里,可作为GC Root对象的包括如下几种: 1. Java虚拟机栈中的引用的对象 ; 2. 方法区中的类静态属性引用的对象 ; 3. 方法区中的常量引用的对象 ; 4. 本地方法栈中JNI的引用的对象。
我们知道,垃圾回收一般是回收堆和方法区的对象,而堆中的对象在正常情况下,一般是通过常量、全局变量、静态变量等间接引用堆中的对象,所以这些可以作为GC Root。
在任何上述的GCRoot中,有引用可以指向时,我们称之为对象可达。
作者回复: 是的
作者回复: 是标记整理算法。
作者回复: 我们可以通过jstat -gc pid interval查看每次GC之后,具体的每一个分区的内存使用率变化情况。我们可以通过查看JVM设置参数来查看具体的垃圾收集器的设置参数,使用的方式有很多,例如jcmd pid VM.flags可以查看到相关的设置参数。
作者回复: 是的,可以手动设置实践下,看看测试的结果
作者回复: 赞
作者回复: 标记可以回收的对象,然后在垃圾回收时将对象回收
作者回复: 是标记和整理的过程
作者回复: 可以进入Oracle官网查看技术文档。链接中只是一部分
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html
作者回复: 可以校验下参数是否配置正确,连接的是否是IDE进程。我们也可以打开gc日志查看具体的信息,不太可能是GC easy的问题。
作者回复: 对的,在后面的答疑课堂中详细讲到了G1
作者回复: 我觉得前者会被后者覆盖,可以自己试试,然后通过指令查询相关的生效参数。