JVM性能調優

  • 年輕代(New):年輕代用來存放JVM剛分配的Java對象
  • 年老代(Tenured):年輕代中通過垃圾回收沒有回收掉的對象將被Copy到年老代
  • 永久代(Perm):永久代存放Class、Method元信息,其大小跟項目的規模、類、方法的量有關,通常設置爲128M就足夠,設置原則是預留30%的空間。

New和Tenured屬於堆內存,堆內存會從JVM啓動參數(-Xmx:3G)指定的內存中分配,Perm不屬於堆內存,有虛擬機直接分配,但能夠經過-XX:PermSize -XX:MaxPermSize 等參數調整其大小。html

New又分爲幾個部分:算法

  • Eden:Eden用來存放JVM剛分配的對象
  • Survivor1
  • Survivro2:兩個Survivor空間同樣大,當Eden中的對象通過垃圾回收沒有被回收掉時,會在兩個Survivor之間來回Copy,當知足某個條件,好比Copy次數,就會被Copy到Tenured。顯然,Survivor只是增長了對象在年輕代中的逗留時間,增長了被垃圾回收的可能性。

 

垃圾回收算法能夠分爲三類,都基於標記-清除(複製)算法:緩存

  • Serial算法(單線程)
  • 並行算法  需stop world
  • 併發算法  

 

當年輕代內存滿時,會引起一次普通GC,該GC僅回收年輕代。須要強調的時,年輕代盡是指Eden代滿,Survivor滿不會引起GC併發

當年老代滿時會引起Full GC,Full GC將會同時回收年輕代、年老代函數

當永久代滿時也會引起Full GC,會致使Class、Method元信息的卸載工具

什麼時候會拋出OutOfMemoryException,並非內存被耗空的時候才拋出spa

  • JVM98%的時間都花費在內存回收
  • 每次回收的內存小於2%

  知足這兩個條件將觸發OutOfMemoryException,這將會留給系統一個微小的間隙以作一些Down以前的操做,好比手動打印Heap Dump。操作系統

 

線程堆棧的設置:每一個線程默認會開啓1M的堆棧,用於存放棧幀、調用參數、局部變量等,對大多數應用而言這個默認值太了,通常256K就足用。理論上,在內存不變的狀況下,減小每一個線程的堆棧,能夠產生更多的線程,但這實際上還受限於操做系統。.net

 

能夠經過下面的參數打Heap Dump信息線程

  • -XX:HeapDumpPath
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -Xloggc:/usr/aaa/dump/heap_trace.txt

    經過下面參數能夠控制OutOfMemoryError時打印堆的信息

  • -XX:+HeapDumpOnOutOfMemoryError

 

判斷死鎖:

1.kill -3, 或jstack Hump出數據,

2.使用工具分析,看全部阻塞Thread, 根據線程都運行狀態

3.看阻塞線程等待的資源,來判斷問題出如今哪兒

http://blog.csdn.net/chen77716/article/details/5695893

 

 

在Java虛擬機規範中,說起了以下幾種類型的內存空間:

◇ 棧內存(Stack):每一個線程私有的。

◇ 堆內存(Heap):全部線程公用的。

◇ 方法區(Method Area):有點像之前常說的「進程代碼段」,這裏面存放了每一個加載類的反射信息、類函數的代碼、編譯時常量等信息。

◇ 原生方法棧(Native Method Stack):主要用於JNI中的原生代碼,平時不多涉及。

 

Eden Space (heap): 內存最初從這個線程池分配給大部分對象。

Survivor Space (heap):用於保存在eden space內存池中通過垃圾回收後沒有被回收的對象。

Tenured Generation (heap):用於保持已經在 survivor space內存池中存在了一段時間的對象。

Permanent Generation (non-heap): 保存虛擬機本身的靜態(refective)數據,例如類(class)和方法(method)對象。Java虛擬機共享這些類數據。這個區域被分割爲只讀的和只寫的,

Code Cache (non-heap):HotSpot Java虛擬機包括一個用於編譯和保存本地代碼(native code)的內存,叫作「代碼緩存區」(code cache)

 

JConsole是必需要介紹的,它是一個用JAVA寫的GUI程序,用來監控VM,並可監控遠程的VM,易用且功能強大。具體可監控JAVA內存、JAVA CPU使用率、線程執行狀況、加載類概況等,Jconsole須要在JVM參數中配置端口才能使用。

http://www.cnblogs.com/ppgeneve/p/5885960.html

 

http://m.blog.csdn.net/zhb123GGGGGG/article/details/40901003

http://m.blog.csdn.net/wanggg2760/article/details/51912491

相關文章
相關標籤/搜索