四十三、谈谈你对GCRoots的理解
什么是垃圾?
简单的说就是内存中已经不再被使用到的空间就是垃圾。
要进行垃圾回收,如何判断一个对象是否可以被回收?
-
引用计数法
-
枚举根节点做可达性分析(根搜索路径)
枚举根节点做可达性分析(根搜索路径)
为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法。
所谓“GC roots”或者说tracing GC的“根集合”就是一组必须活跃的引用。
基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活;没有被遍历到的就自然被判定为死亡。
Java中可以作为GC Roots的对象
1.虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
2.方法区中的类静态属性引用的对象。
3.方法区中常量引用的对象。
4.本地方法栈中JNI(Native方法)引用的对象。
四十四、JVM的标配参数和X参数
JVM的参数类型:
-
标配参数
- -version
java -version
- -help
- -version
-
X参数(了解)
- -Xint:解释执行
- -Xcomp:第一次使用就编译成本地代码
- -Xmixed:混合模式
四十五、JVM的XX参数之布尔类型
公式:-XX:+ 或者 - 某个属性值(+表示开启,-表示关闭)
如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?
jps -l 查看一个正在运行中的java程序,得到Java程序号。
jinfo -flag PrintGCDetails (Java程序号 )查看它的某个jvm参数(如PrintGCDetails )是否开启。
jinfo -flags (Java程序号 )查看它的所有jvm参数
Case
是否打印GC收集细节
-XX:-PrintGCDetails
-XX:+PrintGCDetails
是否使用串行垃圾回收器
-XX:-UseSerialGC
-XX:+UserSerialGC