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、分代
前面三者的綜合使用
新生代:複製
老年代:標記清除/標記整理