JVM查看字節碼信息、GC及分類

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、分代	
						前面三者的綜合使用
						新生代:複製
						老年代:標記清除/標記整理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章