1、字节码信息
代码执行流程
package com.ruozedata.jvm;
public class JvmDemo {
public static void main(String[] args) throws InterruptedException {
System.out.println("zuozedata");
Thread.sleep(100000);
}
}
javap -c JvmDemo.class
javap -verbose -c JvmDemo.class 打印附加信息,比如#1 #2 是什么意思
Compiled from "JvmDemo.java"
public class com.ruozedata.jvm.JvmDemo {
public com.ruozedata.jvm.JvmDemo(); //构造器
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.InterruptedException;
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String zuozedata
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
2、GC和分类
-XX:SurvivorRatio=8
默认值8
新生代Eden S0和S1的比例
-XX:NewRatio=2
新生代和老年代的占比
-XX:MaxTenuringThrshold=15
默认是15,GC的最大年龄
如果是0,表示不经过新生代,直接接入老年代
JMM重点做了什么?
原子性,一致性,还有可见
哪些对象会被GC
1 ) 引用计数
操作对象肯定要引用,引用存在栈里面
就是引用,被其他引用使用了一次,就计数一次
2)枚举根节点可达性分析
堆区GC算法的了解
1、标记-清除 Mark-Sweep
标记: 就是GC Roots开始找==>存活的对象,标记下
清除: 将没有标记的对象全部干掉
但是有很多内存碎片
2、复制 Copy
把内存划分成两个区域,在任意的时间点只有一个是活动的
GC线程会将活动区域的存活对象全部复制到空闲区域,而且内存地址是排序的
新生代GC用得比较多
浪费内存,速度快,没有内存碎片
3、标记-整理 Mark-Compact
标记:就是GC Roots开始找==>存活的对象,标记下
整理:会把活的,内存地址进行排序
耗时间,性能较低
4、分代
前面三者的综合使用
新生代:复制
老年代:标记清除/标记整理