類加載子系統從網絡或者文件系統加載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日誌)
對於線程私有對象,可以打散分配在棧上,而不是分配在堆上。不需要調用垃圾回收,提高系統性能。