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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM内存管理机制和垃圾回收机制

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM内存管理机制和垃圾回收机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JVM內存管理機制和垃圾回收機制

JVM結構

圖片描述:

  • java源碼編譯成class文件
  • class文件通過類加載器加載到內存
  • 其中方法區存放的是運行時的常量、靜態變量、類信息等,被所有線程共享
  • 堆空間存放對象,被所有線程共享
  • 棧空間存放的是棧幀,包括局部變量、操作數棧、返回地址等,每一個方法創建一個棧幀
  • 本地方法棧通過本地方法接口實現本地方法的調用
  • 程序計數器是用來記錄程序執行的位置
  • JAVA代碼編譯

    JAVA字節碼執行

    類加載機制

  • Bootstrap ClassLoader:負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類
  • Extension ClassLoader: 負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
  • App ClassLoader: 負責記載classpath中指定的jar包及目錄中class
  • Custom ClassLoader: 屬于應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規范自行實現ClassLoader
  • 加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。

    類執行機制

    JVM是基于棧的體系結構來執行class字節碼的。線程創建后,都會產生程序計數器(PC)和棧(Stack),程序計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次調用,而棧幀又是有局部變量區和操作數棧兩部分組成,局部變量區用于存放方法中的局部變量和參數,操作數棧中用于存放方法執行過程中產生的中間結果。

    JVM內存組成

    所有通過new創建的對象的內存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被劃分為新生代和舊生代,新生代又被進一步劃分為Eden和Survivor區,最后Survivor由From Space和To Space組成,結構圖如下所示:

    • 新生代:新建的對象都是用新生代分配內存,Eden空間不足的時候,會把存活的對象轉移到Survivor中,新生代大小可以由-Xmn來控制,也可以用-XX:SurvivorRatio來控制Eden和Survivor的比例
    • 舊生代:用于存放新生代中經過多次垃圾回收仍然存活的對象

    每個線程執行每個方法的時候都會在棧中申請一個棧幀,每個棧幀包括局部變量區和操作數棧,用于存放此次方法調用過程中的臨時變量、參數和中間結果

    本地方法棧

    用于支持native方法的執行,存儲了每個native方法調用的狀態

    方法區

    存放了要加載的類信息、靜態變量、final類型的常量、屬性和方法信息。JVM用持久代(Permanet Generation)來存放方法區,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值

    垃圾回收機制

    JVM針對新生代和舊生代采用了不同的GC

    新生代的GC

    新生代通常存活時間較短,因此基于Copying算法來進行回收,所謂Copying算法就是掃描出存活的對象,并復制到一塊新的完全未使用的空間中,對應于新生代,就是在Eden和From Space或To Space之間copy。

    新生代采用空閑指針的方式來控制GC觸發,指針保持最后一個分配的對象在新生代區間的位置,當有新的對象要分配內存時,用于檢查空間是否足夠,不夠就觸發GC。

    用java visualVM來查看,能明顯觀察到新生代滿了后,會把對象轉移到舊生代,然后清空繼續裝載,當舊生代也滿了后,就會報outofmemory的異常,如下圖所示:

    在執行機制上JVM提供了串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并發GC(ParNew)。

  • 串行GC
    在整個掃描和復制過程采用單線程的方式來進行,適用于單CPU、新生代空間較小及對暫停時間要求不是非常高的應用上,是client級別默認的GC方式,可以通過-XX:+UseSerialGC來強制指定
  • 并行回收GC
    在整個掃描和復制過程采用多線程的方式來進行,適用于多CPU、對暫停時間要求較短的應用上,是server級別默認采用的GC方式,可用-XX:+UseParallelGC來強制指定,用-XX:ParallelGCThreads=4來指定線程數
  • 并行GC
    與舊生代的并發GC配合使用
  • 舊生代的GC

    舊生代與新生代不同,對象存活的時間比較長,比較穩定,因此采用標記(Mark)算法來進行回收,所謂標記就是掃描出存活的對象,然后再進行回收未被標記的對象,回收后對用空出的空間要么進行合并,要么標記出來便于下次進行分配,總之就是要減少內存碎片帶來的效率損耗。

    在執行機制上JVM提供了串行GC(Serial MSC)、并行GC(parallel MSC)和并發GC(CMS)。

    你吃飯吃到一半,電話來了,你一直到吃完了以后才去接,這就說明你不支持并發也不支持并行。
    你吃飯吃到一半,電話來了,你停了下來接了電話,接完后繼續吃飯,這說明你支持并發。
    你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持并行。

    指定方式新生代GC方式舊生代GC方式
    -XX:+UseSerialGC串行GC串行GC
    -XX:+UseParallelGC并行回收GC并行GC
    -XX:+UseConeMarkSweepGC并行GC并發GC
    -XX:+UseParNewGC并行GC串行GC
    -XX:+UseParallelOldGC并行回收GC并行GC
    -XX:+ UseConeMarkSweepGC -XX:+UseParNewGC串行GC并發GC
    不支持的組合1、-XX:+UseParNewGC -XX:+UseParallelOldGC 2、-XX:+UseParNewGC -XX:+UseSerialGC

    轉載于:https://www.cnblogs.com/cenzhongman/p/8464928.html

    總結

    以上是生活随笔為你收集整理的JVM内存管理机制和垃圾回收机制的全部內容,希望文章能夠幫你解決所遇到的問題。

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