一.概述:
java對象內(nèi)存申請過程:
1.JVM會試圖為相關(guān)Java對象在Eden中初始化一塊內(nèi)存區(qū)域;當(dāng)Eden空間足夠時栖榨,內(nèi)存申請結(jié)束找都。否則到下一步麻掸;
2.JVM試圖釋放在Eden中所有不活躍的對象(minor collection)梭域,釋放后若Eden空間仍然不足以放入新對象斑举,則試圖將部分Eden中活躍對象放入Survivor區(qū);
3.Survivor區(qū)被用來作為Eden及old的中間交換區(qū)域病涨,當(dāng)old區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū)璧坟,否則會被保留在Survivor區(qū)既穆;
4.當(dāng)old區(qū)空間不夠時赎懦,JVM會在old區(qū)進(jìn)行major collection;
5.垃圾收集后幻工,若Survivor及old區(qū)仍然無法存放從Eden復(fù)制過來的部分對象励两,導(dǎo)致JVM無法在Eden區(qū)為新對象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)"Out of memory錯誤"囊颅;
Stop-The-World:
在新生代進(jìn)行的GC叫做minor GC当悔,在老年代進(jìn)行的GC都叫major GC,F(xiàn)ull GC同時作用于新生代和老年代踢代。在垃圾回收過程中經(jīng)常涉及到對對象的挪動(比如上文提到的對象在Survivor 0和Survivor 1之間的復(fù)制)盲憎,進(jìn)而導(dǎo)致需要對對象引用進(jìn)行更新。為了保證引用更新的正確性胳挎,Java將暫停所有其他的線程饼疙,這種情況被稱為“Stop-The-World”,導(dǎo)致系統(tǒng)全局停頓慕爬。Stop-The-World對系統(tǒng)性能存在影響窑眯,因此垃圾回收的一個原則是盡量減少“Stop-The-World”的時間。
不同垃圾收集器的Stop-The-World情況医窿,Serial磅甩、Parallel和CMS收集器均存在不同程度的Stop-The-Word情況;而即便是最新的G1收集器也不例外姥卢。
Java中一種全局暫停的現(xiàn)象,jvm掛起狀態(tài)
全局停頓更胖,所有Java代碼停止,native代碼可以執(zhí)行隔显,但不能和JVM交互
多半由于jvm的GC引起却妨,如:
1.老年代空間不足。
2.永生代(jkd7)或者元數(shù)據(jù)空間(jkd8)不足括眠。
3.System.gc()方法調(diào)用彪标。
4.CMS GC時出現(xiàn)promotion failed和concurrent mode failure
5.YoungGC時晉升老年代的內(nèi)存平均值大于老年代剩余空間
6.有連續(xù)的大對象需要分配除了GC還有以下原因:
1.Dump線程--人為因素。
2.死鎖檢查掷豺。
3.堆Dump--人為因素捞烟。
Full GC 是清理整個堆空間—包括年輕代和老年代。
GC時為什么會有全局停頓当船?
類比在聚會時打掃房間题画,聚會時很亂,又有新的垃圾產(chǎn)生德频,房間永遠(yuǎn)打掃不干凈苍息,只有讓大家停止活動了,才能將房間打掃干凈。當(dāng)gc線程在處理垃圾的時候竞思,其它java線程要停止才能徹底清除干凈表谊,否則會影響gc線程的處理效率增加gc線程負(fù)擔(dān),特別是在垃圾標(biāo)記的時候盖喷。
危害
- 長時間服務(wù)停止爆办,沒有響應(yīng)
- 遇到HA系統(tǒng),可能引起主備切換课梳,嚴(yán)重危害生產(chǎn)環(huán)境距辆。
- 新生代的gc時間比較短(),危害小暮刃。
- 老年代的gc有時候時間短跨算,但是有時候比較長幾秒甚至100秒--幾十分鐘都有。
- 堆越大花的時間越長沾歪。
三.例子:
- -Xmn1m代表年輕代幾乎沒有空間漂彤。對象都到老年代了。
- 類PrintThread是打印線程灾搏,每100毫秒打印一次挫望,如何應(yīng)用線程暫停了,那么會延遲狂窑。
- 類MyThread是消耗jvm內(nèi)存的線程媳板,每到450M,會讓對象失去引用泉哈。
/**
*
* 啟動參數(shù):-Xmx512m -Xms512m -XX:+UseSerialGC -XX:+PrintGCDetails -Xmn1m
*
* -XX:+UseSerialGC:新生代和老年代都用單線程的串行回收器蛉幸。適合單核并發(fā)能力差得處理器。
* -XX:+UseParNewGC:新生代用并行的ParNew回收期丛晦,老年代都用單線程的串行回收器奕纫。適合多核,并發(fā)能力強(qiáng)的處理器烫沙。
* -XX:+UseParallelGC:新生代使用ParallelGC回收器匹层,老年代使用串行回收器。
-XX:+UseParallelOldGC:新生代使用ParallelGC回收器锌蓄,老年代使用ParallelOldGC回收器升筏。
* 1)--
* -XX:+UseConclMarkSweepGC:老年代使用CMS回收器。
*
* Created by chenyang on 20
* 17/2/2.
*/
public class StopWorldTest {
public static class MyThread extends Thread{
HashMap<Long,byte[]> map=new HashMap<Long, byte[]>();
@Override
public void run() {
try {
while (true){
if(map.size()*512/1024/1024>=450){
System.out.println("============準(zhǔn)備清理==========:"+map.size());//大于450M時瘸爽,清理內(nèi)存您访。
map.clear();
System.out.println("clean map");
}
for(int i=0;i<100;i++){
map.put(System.nanoTime(),new byte[512]);//消耗內(nèi)存。
}
Thread.sleep(1);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public static class PrintThread extends Thread {
public static final long starttime = System.currentTimeMillis();
@Override
public void run() {
try {
while (true) {
long t = System.currentTimeMillis() - starttime;
System.out.println("time:" + t);
Thread.sleep(100);
}
} catch (Exception e) {
}
}
}
public static void main(String[] args) {
MyThread t=new MyThread();
PrintThread p=new PrintThread();
t.start();
p.start();
}
}
gc日志:
14.381
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0044628 secs] 511175K->511171K(524224K), 0.0044856 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0048768 secs] 512067K->512064K(524224K), 0.0048978 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0049033 secs] 512960K->512956K(524224K), 0.0049314 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0047410 secs] 513852K->513848K(524224K), 0.0047609 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
14.486
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0058544 secs] 514744K->514740K(524224K), 0.0058874 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 960K->64K(960K), 0.0045730 secs] 515636K->515635K(524224K), 0.0045907 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0053326 secs] 516531K->516527K(524224K), 0.0053546 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0049539 secs] 517423K->517418K(524224K), 0.0049781 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
14.590
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0046786 secs] 518314K->518311K(524224K), 0.0047022 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0041492 secs] 519207K->519204K(524224K), 0.0041714 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0050918 secs] 520100K->520096K(524224K), 0.0051230 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0041798 secs] 520992K->520987K(524224K), 0.0042189 secs] [Times: user=0.00 sys=0.01, real=0.01 secs]
14.695
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0037032 secs] 521883K->521879K(524224K), 0.0037310 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0052917 secs] 522775K->522774K(524224K), 0.0053151 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 960K->960K(960K), 0.0000131 secs][Tenured: 522710K->523263K(523264K), 0.4556888 secs] 523670K->523666K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4557355 secs] [Times: user=0.45 sys=0.00, real=0.46 secs]
15.212
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3951695 secs] 524223K->524218K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3951971 secs] [Times: user=0.40 sys=0.00, real=0.39 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3942671 secs] 524223K->524222K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3942906 secs] [Times: user=0.39 sys=0.01, real=0.40 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->516027K(523264K), 0.4641148 secs] 524222K->516027K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4641369 secs] [Times: user=0.46 sys=0.00, real=0.46 secs]
15.619
[GC (Allocation Failure) [DefNew: 896K->64K(960K), 0.0025171 secs] 516923K->516887K(524224K), 0.0025344 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0042796 secs] 517783K->517781K(524224K), 0.0043039 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0053306 secs] 518677K->518670K(524224K), 0.0053572 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0052464 secs] 519566K->519564K(524224K), 0.0052719 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
16.583
[GC (Allocation Failure) [DefNew: 959K->64K(960K), 0.0050433 secs] 520460K->520444K(524224K), 0.0050696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 960K->64K(960K), 0.0050287 secs] 521340K->521333K(524224K), 0.0050566 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 960K->63K(960K), 0.0059352 secs] 522229K->522227K(524224K), 0.0059838 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [DefNew: 959K->63K(960K), 0.0051672 secs] 523123K->523111K(524224K), 0.0051959 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
16.687
[GC (Allocation Failure) [DefNew: 959K->959K(960K), 0.0000174 secs][Tenured: 523047K->523263K(523264K), 0.4289996 secs] 524007K->523991K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4290569 secs] [Times: user=0.43 sys=0.00, real=0.43 secs]
17.141
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3752676 secs] 524223K->524219K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3753102 secs] [Times: user=0.37 sys=0.01, real=0.38 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3974346 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3974563 secs] [Times: user=0.40 sys=0.00, real=0.39 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4509967 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4510171 secs] [Times: user=0.45 sys=0.00, real=0.46 secs]
17.522
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3911804 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3912023 secs] [Times: user=0.39 sys=0.00, real=0.39 secs]
18.762[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4247627 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4247850 secs] [Times: user=0.42 sys=0.00, real=0.42 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.4053384 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.4053664 secs] [Times: user=0.41 sys=0.00, real=0.41 secs]
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K), 0.3821490 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3821753 secs] [Times: user=0.38 sys=0.00, real=0.38 secs]
19.593[Full GC (Allocation Failure) [TenuredException in thread "Thread-0" : 523263K->523263K(523264K), 0.3890329 secs] 524223K->524223K(524224K), [Metaspace: 3131K->3131K(1056768K)], 0.3890547 secs] [Times: user=0.39 sys=0.01, real=0.39 secs]
說明:
- 17.141秒前都是100ms打印一次剪决,線程沒有停頓灵汪。但是之后發(fā)生了因full gc引發(fā)零點幾秒甚至將近1s的停頓檀训。
- 因為對象的引用還在,老年代的對象不會被回收识虚。如:
[Full GC (Allocation Failure) [Tenured: 523263K->523263K(523264K),