jvm 診斷與優化 (1)


jvm分爲: java

  1. 類加載子系統 : 負責從網絡或文件系統中加載類
  2. 垃圾回收系統 : 對方法區,java堆,直接內存,進行回收。負責對象的管理
  3. 執行引擎 : 負責執行字節碼

{ 受到GC管理(線程共享) c++

  1. java堆  : 在jvm啓動時建立,主要的內存工做區域。java全部對象實例都放在其中,是全部線程共享的
  2. 方法區 (持久區PermSize):存放常量(字符串數字)和類加載後的信息
  3. 直接內存 : 指操做系統中的內存,java能夠向系統申請。訪問比堆來的快

}{爲每一個線程私有空間 網絡

  1. java棧 :一個線程啓動時建立線程都有各自的棧,保存着局部變量,方法參數。和方法的調用,返回密切相關
  2. 本地方法棧 : 與java棧相似,用於本地方法的調用(c,c++)
  3. pc寄存器 : 是每一個線程的私人空間

} jvm

設置最大空間256MB(按需分配),  初始空間50MB spa

java -Xmx256M    -Xms50M         // 代碼中查看: Runtime.getRuntime().maxMemory() 操作系統

設置線程最大的空間,128K, 決定java嵌套調用的最大層次 線程

(說明:java每嵌套調用一個方法就會向java棧中壓入一個棧幀①。調用的層次越多棧內存就消耗的越多。當棧內存已經沒法支付方法的調用時拋出StackOverflowError) 代理

java -Xss128K  對象

設置方法區的初始與最大使用空間分別爲5MB和64MB 內存

java -XX:PermSize=5M -XX:MaxPermSize=64M            //jdk6 , jdk7 設置

(說明:分配越大的空間,就能夠加載越多的類。動態代理可能會建立大量並加載大量的類。

在jdk8中的設置: java -XX:MaxMetaspaceSize64M。在jdk中若是不設置大小,虛擬機可能會耗盡全部的系統內存,由於它用的是直接內存。)

①棧幀:{

1.局部變量表:用於存在方法的參數與局部變量,僅僅是變量名,其引用指向堆中

2.操做數據棧:保存計算過程的中間結果,一個臨時的存儲空間

3.幀數據區: 常量池解析,方法的返回結果,與異常的處理

}

相關文章
相關標籤/搜索