運維人所應該知曉的java虛擬機



  • 類加載子系統從網絡或者文件系統加載class信息,加載的類放在一塊成爲方法區的內存空間。

    • 方法區存放運行時常量池信息(包括 字符串 字面量 數字常量),都是通過常量池部分的內存映射。-xx:PermSize -xx:MaxPermiSize

    • java堆 是主要的內存工作區,幾乎所有的java對象實例都存在java堆中。堆空間的所有進程都是共享的。

    • java 1.7支持NIO允許程序使用直接內存。直接內存是在java堆外的,直接的向系統申請內存區間。訪問直接內存速度優於java堆,適合頻繁讀寫的場合,這個內存的大小取決於系統內存大小。-XX:MaxDirectMemorySize 一般的認爲直接內存比堆內存快40%

    • 垃圾回收可以對方法區 java堆棧 和直接內存進行回收。

      • -XX:+PrintGC or -XX:+PrintGCDetail

      • -XX:+PrintGCTimeStamps(打印發生時間)

      • -XX:+PrintGCApplicationConcurrentTime 打印應用程序的執行時間

      • -XX:+PrintGCApplicationStoppedTime 可以打印應用程序由於GC而產生的停頓時間

      • -XX:+PrintReferenceGC 如果想跟蹤系統內的軟引用 弱引用 和 Finallize隊列

      • -XX:+TraceClassLoading跟蹤類的加載

      • -XX:+TraceClassUnloading跟蹤類的卸載

      • -XX:Perm

      • 堆溢出  -XX:+HeapDumpOnOutOfMemoryError

      • 發生溢出導出線程轉存的例子


    • 每一個虛擬機都有一個私有的,棧中保存在局部變量和方法參數 java方法的調用

      • -Xss 線程的棧大小

    • 本地方法棧 用於本地方法調用

    • pc 寄存器也是每一個線程私有空間,每一個java線程創建pc寄存器。

    • 執行引擎是java虛擬機的最核心的組件之一,負責執行虛擬機的字節碼

  • Xms堆內存 xss 棧內存

  • 新生代配置  -Xmn

    • 新生代分爲 eden空間 from空間 to空間 三個部分  from和to空間也叫survior空間

      • -XX:SurviorRatio=eden/from=eden/to 空間比例關係

      • -XX:NewRatio 來設置老年代/新生代

  • 老年代使用標記壓縮法

    • 標記壓縮法就是從根節點出發標記所有可達對象做一次標記,然後將所有存活的對象壓縮到內存的一端,最後清理邊界外所有空間。

  • 出入棧

    • java堆和數據密切相關,那麼java棧就和線程執行密切相關

      • 每一次函數調用都有一個棧被壓入java棧,每一個函數調用結束,就有一個棧幀彈出java棧。

      • java方法有兩種返回函數的方式,一種是正常的函數返回,一種是拋出異常。

  • 操作數棧

    • 操作數棧也是棧幀中重要內容之一,他主要用語保存計算過程的中間結果,同時作爲計算過程中的變量的存儲空間。

  • 幀數據區

    • 保存着訪問常量池的指針,方便程序訪問常量池。

  • 棧上分配(-XX:EliminateAllocations默認打開 -XX:+printGC 打印gc日誌)

    • 對於線程私有對象,可以打散分配在棧上,而不是分配在堆上。不需要調用垃圾回收,提高系統性能。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章