New和Tenured屬於堆內存,堆內存會從JVM啓動參數(-Xmx:3G)指定的內存中分配,Perm不屬於堆內存,有虛擬機直接分配,但能夠經過-XX:PermSize -XX:MaxPermSize 等參數調整其大小。html
New又分爲幾個部分:算法
垃圾回收算法能夠分爲三類,都基於標記-清除(複製)算法:緩存
當年輕代內存滿時,會引起一次普通GC,該GC僅回收年輕代。須要強調的時,年輕代盡是指Eden代滿,Survivor滿不會引起GC併發
當年老代滿時會引起Full GC,Full GC將會同時回收年輕代、年老代函數
當永久代滿時也會引起Full GC,會致使Class、Method元信息的卸載工具
什麼時候會拋出OutOfMemoryException,並非內存被耗空的時候才拋出spa
知足這兩個條件將觸發OutOfMemoryException,這將會留給系統一個微小的間隙以作一些Down以前的操做,好比手動打印Heap Dump。操作系統
線程堆棧的設置:每一個線程默認會開啓1M的堆棧,用於存放棧幀、調用參數、局部變量等,對大多數應用而言這個默認值太了,通常256K就足用。理論上,在內存不變的狀況下,減小每一個線程的堆棧,能夠產生更多的線程,但這實際上還受限於操做系統。.net
能夠經過下面的參數打Heap Dump信息線程
經過下面參數能夠控制OutOfMemoryError時打印堆的信息
判斷死鎖:
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