http://wenku.baidu.com/view/cb7becb765ce050876321307.htmlhtml
2. 性能測試總結以內存泄露和內存溢出java
http://www.uml.org.cn/Test/200912106.asp程序員
剛剛作完了一個項目的性能測試,「有幸」也遇到了內存泄露的案例,因此在此和你們分享一下。服務器
主要從如下幾部分來講明,關於內存和內存泄露、溢出的概念,區份內存泄露和內存溢出;內存的區域劃分,瞭解GC回收機制;重點關注如何去監控和發現內存問題;此外分析出問題還要如何解決內存問題。jvm
下面就開始本篇的內容:工具
第一部分 概念性能
衆所周知,java中的內存java虛擬機本身去管理的,他不想C++須要本身去釋放。籠統地去講,java的內存分配分爲兩個部分,一個是數據堆,一個是棧。程序在運行的時候通常分配數據堆,把局部的臨時的變量都放進去,生命週期和進程有關係。可是若是程序員聲明瞭static的變量,就直接在棧中運行的,進程銷燬了,不必定會銷燬static變量。測試
另外爲了保證java內存不會溢出,java中有垃圾回收機制。 System.gc()即垃圾收集機制是指jvm用於釋放那些再也不使用的對象所佔用的內存。java語言並不要求jvm有gc,也沒有規定gc如何工做。垃圾收集的目的在於清除再也不使用的對象。gc經過肯定對象是否被活動對象引用來肯定是否收集該對象。spa
而其中,內存溢出就是你要求分配的java虛擬機內存超出了系統能給你的,系統不能知足需求,因而產生溢出。線程
內存泄漏是指你向系統申請分配內存進行使用(new),但是使用完了之後卻不歸還(delete),結果你申請到的那塊內存你本身也不能再訪問,該塊已分配出來的內存也沒法再使用,隨着服務器內存的不斷消耗,而沒法使用的內存愈來愈多,系統也不能再次將它分配給須要的程序,產生泄露。一直下去,程序也逐漸無內存使用,就會溢出。
第二部分 原理
JAVA垃圾回收及對內存區劃分
在Java虛擬機規範中,說起了以下幾種類型的內存空間:
◇ 棧內存(Stack):每一個線程私有的。
◇ 堆內存(Heap):全部線程公用的。