日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java核心技术-jvm基础知识

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java核心技术-jvm基础知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • JVM回顧
    • JVM、JRE、JDK之間關系?
    • Java程序執行過程?
      • 面試官:解釋執行和JIT(及時編譯)兩種執行方式有什么區別?
  • java虛擬機內存管理
    • jvm整體架構
    • JVM只是定義內存劃分規范等,具體實現依賴不同虛擬機實現,如HotSpot虛擬機
    • jvm運行時內存
      • 程序計數器(PC寄存器)
        • 面試官:程序計數器是什么?
      • 面試官:java多線程如何實現的?多個線程同時執行的?
      • 虛擬機棧
        • 面試官:什么是java虛擬機棧?
      • 本地方法棧
      • 元空間
        • 面試官:為什么要廢棄永久代,引入元空間?
      • 方法區
        • 面試官:元空間和方法區有什么區別?
      • 運行時常量池
        • 面試官:常量池和運行時常量池有什么區別?
      • 直接內存
        • 面試官:你知道如何讀取大文件不保證內存溢出?
        • 面試官:給我講講什么是NIO以及實現原理?
    • OOM異常
  • JVM類加載機制
    • 面試官:你知道一個java類從編譯到運行的全過程?
      • java源碼編譯階段
    • 面試官:給我講講類整個執行過程?
    • 類加載系統
    • 類加載系統的執行過程
      • 面試官:給我講講類加載執行順序以及各個階段作用?
      • 加載
      • 驗證
      • 準備
      • 解析
      • 面試官:“解析”一定要在“初始化”之前執行?什么是“靜態綁定”和“動態綁定”?
      • 初始化
        • 面試官:給我講講類初始化階段 靜態變量、靜態代碼塊以及包含子類父類等初始化順序?
    • 類加載器
      • 面試官:Class對象和實例對象以及類之間的區別?
      • 類加載器分類
    • 雙親委派模型
      • 什么是雙親委派模型?
      • 如何自定義類加載器?
    • 自定義類加載器
    • ClassLoader源碼剖析
  • 垃圾回收機制及算法
    • 如何判斷對象已經死亡?
    • 面試:講講常見的垃圾收集算法?
    • 面試:垃圾回收器了解?講講幾種垃圾回收器?
      • 我理解的垃圾回收器
      • Serial收集器
      • ParNew收集器
      • Parallel Scavenge收集器
      • Serial Old收集器
      • Parallel Old收集器
      • CMS收集器
      • 【面試必問】G1收集器
  • 用過jvm調優工具?
    • jvm常用指令
    • jvm常用工具
      • Jconsole監控管理工具
      • VisualVM可視化工具
  • 線上問題如何對GC日志分析?
    • 理解GC日志參數
    • GC日志分析方法
    • GC日志分析工具
  • 對生產環境jvm調優過?
    • tomcat
    • jmeter
    • 有過jvm參數優化經驗?你們生產環境jvm啟動參數如何配置對:

JVM回顧

JVM、JRE、JDK之間關系?

  • JVM(java virtual machine):java虛擬機,它是操作系統和我們java程序的橋梁,它封裝了操作系統和java程序底層交互信息(底層還是解釋成操作系統識別的指令),使java一次編譯處處運行。它定義了java內存區域、虛擬機類加載過程、垃圾回收等一整套流程,使得我們java程序能夠順利在操作系統基礎上運行。
  • JRE(java runtime environment):java運行環境,單靠JVM是無法完成一次編譯處處運行的,還需要很多基礎類庫,例如:怎么操作文件、怎么連接網絡等,因此 JRE=JVM+基礎類庫。
  • JDK(java developer kit):java開發工具,現在JRE給我們提供了運行環境,但是想讓開發者能夠順利編寫代碼,使它們不用去關心底層實現,因此JDK面向開發者提供了更多的類庫、小工具,例如:java、javac、jar工具、集合框架、并發框架等基礎類庫等等,因此 JDK=JRE+面向開發者的類庫、工具。
  • Java程序執行過程?

    面試官:解釋執行和JIT(及時編譯)兩種執行方式有什么區別?

    我們一直在說 Java 字節碼是溝通 JVM 與 Java 程序的橋梁,下面使用 javap 來稍微看一下字節碼到底長什么樣子。

    package net.dreamzuora.jvm;public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World");} }

    查看字節碼指令步驟:
    1.javac Helloword.java
    2.javap -c HelloWorld

    警告: 二進制文件HelloWorld包含net.dreamzuora.jvm.HelloWorld Compiled from "HelloWorld.java" public class net.dreamzuora.jvm.HelloWorld {public net.dreamzuora.jvm.HelloWorld();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 獲取靜態字段的值3: ldc #3 // String Hello World 常量池中的常量值入棧5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V invokevirtual 運行時方法綁定調用方法8: return }

    然后 JVM 會翻譯這些字節碼,它有兩種執行方式。常見的就是解釋執行將 字節碼指令 + 操作數翻譯成機器代碼
    另外一種執行方式就是 JIT,也就是我們常說的即時編譯,它會在一定條件下將字節碼編譯成機器碼之后再執行

    編譯器是把源程序的每一條語句都編譯成機器語言,并保存成二進制文件,翻譯與執行是分開的,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;C,C++都是靠編譯實現的。
    解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,翻譯與執行一次性完成,所以運行速度是不如編譯后的程序運行的快的,但是就啟動效率而言,解釋執行的速度更快,因為它不需要進行編譯過程

    Java程序也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯成為字節碼,然后在JVM上用解釋方式執行字節碼。Python 的也采用了類似Java的編譯模式

    Java通過解釋器解釋執行字節碼,這樣的執行方式相對較,尤其是遇到一些運行頻繁的代碼塊或者方法時。于是后來JVM引入了JIT即時編譯器(just in time),當JVM發現某些代碼運行頻繁時就會認定為熱點代碼“hot spot code”,為了提高運行效率,就會把這些代碼編譯成為平臺相關的機器碼然后進行優化,JIT就是用來完成這項工作的。二者共同造就了java的優勢——當程序需要迅速啟動時,解釋器首先發揮作用,省去編譯時間,當程序運行時,編譯器會逐漸將更多的代碼編譯成本地機器碼從而獲得更高的效率。

    引用:《解釋執行與編譯執行以及JIT的區別》

    java虛擬機內存管理

    jvm整體架構

    名稱作用配置參數異常
    程序計數器(線程私有)字節碼運行的行號指令器
    虛擬機棧(線程私有)存儲局部變量表、操作棧、動態鏈接、方法出口等信息-XssStackOverflowError/ OutOfMemoryError
    保存對象實例(包括數組)-Xmn -Xms -XsxOutOfMemoryError
    方法區類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據-XX:PermSize:16M -XX:MaxPermSize:64MBOutOfMemoryError
    本地方法棧為虛擬機使用到的Native 方法服務StackOverflowError/OutOfMemoryError

    JVM只是定義內存劃分規范等,具體實現依賴不同虛擬機實現,如HotSpot虛擬機

    jvm運行時內存

    程序計數器(PC寄存器)

    面試官:程序計數器是什么?

  • 是一塊較小的內存單元。
  • 看作->當前線程所執行的字節碼行號指令器。
  • 字節碼解釋器工作時通過改變計數器的值來選取將要執行的字節碼指令、分支、循環、跳轉、異常處理等功能。
  • 特點:
    1.計算機上的PC寄存器是用來存放“偽指令”或地址,jvm中的pc寄存器(程序計算器)是一塊內存用來存放將要執行的指令地址
    2.程序計數器是線程私有的,生命周期同線程生命周期,每個線程都有一個
    3.該區域不回出現OOM

    面試官:java多線程如何實現的?多個線程同時執行的?

    jvm通過給線程分配處理器執行時間,使線程能夠執行,但是一個處理器一次只能執行一條指令,因此java多線程是通過線程切換的方式使得在同一時間段多個線程同時執行,但是同一時刻一個處理器只能執行一個線程。

    因此為了多線程能夠順利切換,需要利用程序計數器來記錄每個線程運行的字節碼指令,并且屬于線程私有內存,各個線程互不共享。

    虛擬機棧

    參考文章:
    操作數棧詳解
    動態鏈接、棧幀解釋

    面試官:什么是java虛擬機棧?

    切記:java虛擬機棧是線程私有的

  • 存儲局部變量表:方法參數、方法內定義的局部變量,存儲的是八種基本數據類型以及returnAddress類型(指向一條指向字節碼指令的地址)
  • 方法返回地址:return或者拋出異常返回的地址
  • 操作數棧:用來程序計算的存儲單元
  • 動態鏈接:將字節碼中對應的符號引用變成直接引用地址
  • 本地方法棧

    和java虛擬機棧類似只不過執行的是native方法

    特點:

  • 存儲對象實例、數組
  • 堆是多線程共享空間,除了TLAB( Thread Local Allocation Buffer)堆中也包含私有的線程緩沖區
  • 垃圾回收的主要區域
  • 堆劃分:
    jdk7:年輕代、老年代、永久代
    jdk8:年輕代、老年代

    GC:
    分為部分GC和整個FULL GC
    部分收集器: 不是完整收集java堆的的收集器,它又分為:
    新生代收集(Minor GC / Young GC): 只是新生代的垃圾收集
    老年代收集 (Major GC / Old GC): 只是老年代的垃圾收集 (CMS GC 單獨回收老年代)
    混合收集(Mixed GC):收集整個新生代及老年代的垃圾收集 (G1 GC會混合回收, region區域回收)
    整堆收集(Full GC):收集整個java堆方法區的垃圾收集器

    元空間


    從 JDK 1.8 開始,移除永久代,并把方法區移至元空間,它位于本地內存中,而不是虛擬機內存中。

    面試官:為什么要廢棄永久代,引入元空間?

  • 原來的永久代中存儲類的元數據、靜態變量、常量等,永久代中等空間大小不好確定,如果內存太小會內存溢出
  • 永久代回收概率低,會對GC回收造成干擾
  • 這樣做的好處:

  • 由于類的元數據分配在本地內存中,元空間的最大可分配空間就是系統可用內存空間。不會遇到永久代存在時的內存溢出錯誤。
  • 運行時常量池從PermGen分離出來,與類的元數據分開,提升類元數據的獨立性。
  • 元數據從PermGen剝離出來到Metaspace,可以提升對元數據的管理同時提升GC效率。
  • 方法區

    與Java堆一樣, 是各個線程共享的內存區域, 它用于存儲已被虛擬機加載 的類型信息、常量、 靜態變量、 即時編譯器編譯后的代碼緩存等數據。

    類型信息
    對每個加載的類型(類Class、接口 interface、枚舉enum、注解 annotation),JVM必須在方法區中存儲以下類型信息:

    • ① 這個類型的完整有效名稱(全名 = 包名.類名)
    • ② 這個類型直接父類的完整有效名(對于 interface或是java.lang. Object,都沒有父類)
    • ③ 這個類型的修飾符( public, abstract,final的某個子集)
    • ④ 這個類型直接接口的一個有序列表

    域信息
    域信息,即為類的屬性,成員變量
    JVM必須在方法區中保存類所有的成員變量相關信息及聲明順序。
    域的相關信息包括:
    域名稱、域類型、域修飾符(pυblic、private、protected、static、final、volatile、transient的
    某個子集)

    方法信息
    JVM必須保存所有方法的以下信息,同域信息一樣包括聲明順序:

  • 方法名稱方法的返回類型(或void) 2. 方法參數的數量和類型(按順序)
  • 方法的修飾符public、private、protected、static、final、synchronized、native,、abstract的一個子集
  • 方法的字節碼bytecodes、操作數棧、局部變量表及大小( abstract和native方法除外)
  • 異常表( abstract和 native方法除外)。每個異常處理的開始位置、結束位置、代碼處理在程序計數器中的偏
    移地址、被捕獲的異常類的常量池索引
  • 面試官:元空間和方法區有什么區別?

    運行時常量池

    面試官:常量池和運行時常量池有什么區別?

    字節碼文件中,內部包含了常量池
    方法區中,內部包含了運行時常量池
    常量池:存放編譯期間生成的各種字面量與符號引用*
    運行時常量池:常量池表在運行時的表現形式
    編譯后的字節碼文件中包含了類型信息、域信息、方法信息等。通過ClassLoader將字節碼文件的常量池中的信息加
    載到內存中,存儲在了方法區的運行時常量池中。

    讓我們來看看字節碼編譯后,查看常量池相關信息

    package net.dreamzuora.jvm;public class HelloWorld {public HelloWorld() {}public static void main(String[] var0) {System.out.println("Hello World");} }

    反編譯:javap -verbose HelloWorld.class

    字節碼文件除了包含了類的版本信息、方法、字段、接口等描述信息外,還包括常量池表:包括字面量、域、類型和方法的符號引用。

    虛擬機指令根據常量池表找到要執行的類名、方法名、參數類型、字面量等類型。

    指令解釋:ldc 把常量池中的項壓入棧、getstatic 從類中獲取靜態字段、調度對象的實現方法:invokevirtual

    Javap與JVM指令解釋

    為什么需要常量池?

    public class Solution { public void method() { System.out.println("dreamzuora"); } }

    這段代碼很簡單,但是里面卻使用了 String、 System、 PrintStream及Object等結構。如果代碼多,引用到的結構會
    更多!這里就需要常暈池,將這些引用轉變為符號引用,具體用到時,采取加載。

    直接內存

    直接存儲大小不受JVM里內存,它是直接利用操作系統內存的堆外內存。

    面試官:你知道如何讀取大文件不保證內存溢出?

    利用MappedByteBuffer類來讀取,讀取方式

    面試官:給我講講什么是NIO以及實現原理?

    NIO:New Input/Output
    NIO基于通道(Channel)和緩沖區(Buffer)的IO方式,通過Native方法直接分配堆外內存,然后通過存儲在java堆中的DirectByteBuffer對象引用這個內存地址進行操作,NIO之所以快這是通過這種方式直接訪問堆外內存避免了java堆和native堆來回copy。

    ByteBuffer:讀取虛擬機分配的堆內存,受堆大小影響,會有OOM。
    DirectByteBuffer:繼承ByteBuffer,但是直接訪問虛擬機物理內存的類,
    在訪問普通的ByteBuwer時,系統總是會使用一個“內核緩沖區”進行操作。
    而DirectBuwer所處的位置,就相當于這個“內核緩沖區”。因此,使用DirectBuwer是一種更加接近內存底層的方法,所以它的速度比普通的ByteBuwer更快。(???這塊沒搞懂后期補充)

    《Linux 內核詳解以及內核緩沖區技術》

    OOM異常

    JVM類加載機制

    面試官:你知道一個java類從編譯到運行的全過程?

    java源碼編譯階段->類加載階段->執行階段

    java源碼編譯階段

    執行:javac HelloWord.java將java->變成class文件
    編譯階段做的三件事(這塊想深入理解可以去看《編譯原理》日后有時間會簡單做個總結)

  • 詞法分析和輸入到符號表
  • 注解處理
  • 語義分析與字節碼class文件生成
    詳細過程:
  • 源代碼文件.java -> 詞法分析器 -> tokens流 -> 語法分析器 -> 語法樹/抽象語法樹 -> 語義分析器 -> 注解抽象語法樹 -> 字節碼生成器 -> JVM字節碼文件.class

    查看字節碼信息:javap -c HelloWord.class

    引用:
    《編譯做了哪些事》
    《java 編譯和加載和執行類的全過程》
    類加載階段以下內容會講到

    面試官:給我講講類整個執行過程?

    類加載系統

  • 類加載子系統負責從文件、網絡中加載.class文件
  • 將類信息存放到方法區,還會存儲常量池信息(字符串字面量、數字常量)
  • classLoader只負責加載,運行由執行引擎(Execution engine)決定
  • 調用構造方法將對象實例存儲到堆中
  • 類加載系統的執行過程

    面試官:給我講講類加載執行順序以及各個階段作用?

    加載、驗證、準備、解析、初始化、使用、卸載

    簡要說明:

  • 加載:把Java字節碼byte[]轉換成JVM中的java.lang.Class類的對象;
  • 驗證:Java類的鏈接指的是將Java類的二進制代碼合并到JVM的運行狀態之中的過程。
  • 初始化:主要是執行靜態代碼塊和初始化靜態域;
  • 加載

  • 預加載:加載JAVA_HOME/lib/下的rt.jar下的.class文件
  • 運行時加載:虛擬機在用到一個.class文件的時候,會先去內存中查看一下這個.class文件有沒有被加載,如果沒有就會按照類的全限定名來加載這個類
    加載階段的三件事:
    1.獲取class文件二進制流(文件讀取操作rt.jar中)
    2.將類信息、靜態變量、常量、字節碼放入方法區
    3.在內存中生成一個代表這個.class文件的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。一般
    這個Class是在堆里的,不過HotSpot虛擬機比較特殊,這個Class對象是放在方法區中的
  • 虛擬機規范對這三點的要求并不具體,因此虛擬機實現與具體應用的靈活度都是相當大的。例如第一條,根本沒有
    指明二進制字節流要從哪里來、怎么來,因此單單就這一條,就能變出許多花樣來:

  • 從zip包中獲取,這就是以后jar、ear、war格式的基礎
  • 從網絡中獲取,典型應用就是Applet
  • 運行時計算生成,典型應用就是動態代理技術
  • 由其他文件生成,典型應用就是JSP,即由JSP生成對應的.class文件
    從數據庫中讀取,這種場景比較少見
  • 驗證

    .class文件不光是通過java編譯而來,可以通過任何手段生成class文件,例如利用十六進制編輯器生成等,因此為了驗證class文件是否合法,需要對class信息進行驗證。

  • 文件格式驗證
  • 元數據驗證
  • 字節碼驗證
  • 符號引用驗證
  • 準備

    為類的變量分配空間并初始賦值在方法區中,類的實例變量在初始化的時候賦值并分配在堆中。

    這個階段賦初始值的變量指的是那些不被final修飾的static變量,比如"public static int value = 123",value在準備階段過后是0而不是123,給value賦值為123的動作將在初始化階段才進行;比如"public static final int value = 123;"就不一樣了,在準備階段,虛擬機就會給value賦值為123。



    code-snippet 1 將會輸出 0,而 code-snippet 2將無法通過編譯。

    切記
    這是因為局部變量不像類變量那樣存在準備階段。類變量有兩次賦初始值的過程,一次在準備階段,賦予初始值(也可以是指定值);另外一次在初始化階段,賦予程序員定義的值。

    因此,即使程序員沒有為類變量賦值也沒有關系,它仍然有一個默認的初始值。但局部變量就不一樣了,如果沒有給它賦初始值,是不能使用的。

    解析

    解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程。

    符號引用和我們上面講的是一樣的,是對于類、變量、方法的描述。符號引用和虛擬機的內存布
    局是沒有關系的,引用的目標未必已經加載到內存中了。

    解析階段負責把整個類激活,串成一個可以找到彼此的網,過程不可謂不重要。那這個階段都做了哪些工作呢?

  • 類或接口的解析
  • 類方法解析
  • 接口方法解析
  • 字段解析
  • 面試官:“解析”一定要在“初始化”之前執行?什么是“靜態綁定”和“動態綁定”?

    加載、驗證、準備、初始化、卸載這5個階段的順序是確定的,類的加載過程必須按照這種順序按部就班地
    開始,而解析階段不一定:它在某些情況下可以初始化階段之后在開始,這是為了支持Java語言的運行時綁定(也稱為動態綁定)。

    當子類和父類(接口和實現類)存在同一個方法時,子類重寫父類(接口)方法時,程序在運行時調用的方法時,是調用父類(接口)的方法呢?還是調用子類的方法呢?我們將確定這種調用何種方法的操作稱之為綁定。

    靜態綁定是在程序執行前就已經被綁定了(也就是在程序編譯過程中就已經知道這個方法是哪個類中的方法)。

    動態綁定:編譯器在每次調用方法時都要進行搜索,時間開銷相當大。因此虛擬機會預先為每個類創建一個方發表(method table),其中列出了所有方法的簽名和實際調用的方法。

    引用:《動態綁定和靜態綁定》

    初始化

    類初始化階段做的事情:

  • 類初始化,調用類構造器cinit()方法對類初始化
  • 對象初始化,構建實例對象,調用類的構造方法init()初始化對象
  • 類的初始化和對象初始化?
    cinit()方法:類構造器對類的靜態變量、靜態代碼塊初始化過程
    init()方法:調用類的構造方法對實例對象進行初始化

    首先讓我們類看看這段代碼:

    public class InitDemo {static {i = 0;System.out.println(i);}static int i = 1;public static void main(String[] args) {} }

    第一個問題:這段代碼執行結果是什么?

    答案:會報錯。

    那么第二個問題:這段代碼為什么會報錯,會拋出什么異常?

    那么第三問題:為什么會拋出這個異常?

    編譯器收集的順序是由語句在源文件中出現的順序決定的, 靜態語句塊中只能訪問到定義在靜態語句塊之前的變量, 定義在它之后的變量, 在前面的靜態語句塊可以賦值, 但是不能訪問

    面試官:給我講講類初始化階段 靜態變量、靜態代碼塊以及包含子類父類等初始化順序?

    執行步驟:

  • 父類靜態變量和靜態代碼塊(先聲明的先執行);
  • 子類靜態變量和靜態代碼塊(先聲明的先執行);
  • 父類的變量和代碼塊(先聲明的先執行);
  • 父類的構造函數;
  • 子類的變量和代碼塊(先聲明的先執行);
  • 子類的構造函數。
  • 面試官:Java語言里,new表達式總體負責兩個動作?

  • 分配對象空間并對其做默認初始化。默認初始化會將對象的所有成員字段設到其類型對應的默認值(零值)。
  • 初始化對象會按照程序猿設定的值對類變量、局部變量等值賦值
  • 引用文章:
    《靜態變量、代碼塊、子類父類等順序》
    《類初始化階段做的事》

    類加載器

    類加載器負責將class字節碼文件二進制流加載到內存中,放入方法區,并生成java.lang.Class對象的過程,用來封裝類在方法區內的數據結構。

    注意:JVM主要在程序第一次主動使用類的時候,才會去加載該類,也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內存中,而是到不得不用的時候才把它加載進來,而且只加載一次。

    面試官:Class對象和實例對象以及類之間的區別?

    《javaClass對象詳解》

    類加載器分類

    BootstrapClassLoader引導類加載器、自定義類加載器(ExtensionClassLoader拓展類加載器,SystemClassLoader系統類加載器、用戶自定義類加載器)

    作用:不同的類加載器負責加載不同路徑下的Class
    《通俗易懂 啟動類加載器、擴展類加載器、應用類加載器》

    雙親委派模型

    什么是雙親委派模型?

    有了雙親委派模型,黑客自定義的 java.lang.String 類永遠都不會被加載進內存。因為首先是最頂端的類加載器加載系統的 java.lang.String 類,最終自定義的類加載器無法加載 java.lang.String 類。

    或許你會想,我在自定義的類加載器里面強制加載自定義的 java.lang.String 類,不去通過調用父加載器不就好了嗎?確實,這樣是可行。但是,在 JVM 中,判斷一個對象是否是某個類型時,如果該對象的實際類型與待比較的類型的類加載器不同,那么會返回false。

    如何自定義類加載器?

    自定義類加載器

    ClassLoader源碼剖析

    垃圾回收機制及算法

    如何判斷對象已經死亡?

    面試:講講常見的垃圾收集算法?

    面試:垃圾回收器了解?講講幾種垃圾回收器?

    我理解的垃圾回收器

    Serial收集器

    serial:Serial(串行)[?s??ri?l]收集器

    ParNew收集器

    Parallel Scavenge收集器

    Parallel scavenge:Parallel(并行)[?p?r?lel] Scavenge(清除)[?sk?v?nd?]收集器

    Serial Old收集器

    Parallel Old收集器

    CMS收集器

    【面試必問】G1收集器

    用過jvm調優工具?

    jvm常用指令

    jvm常用工具

    Jconsole監控管理工具

    VisualVM可視化工具

    線上問題如何對GC日志分析?

    理解GC日志參數

    GC日志分析方法

    GC日志分析工具

    對生產環境jvm調優過?

    tomcat

    jmeter

    有過jvm參數優化經驗?你們生產環境jvm啟動參數如何配置對:

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的java核心技术-jvm基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。