java8中的默認(rèn)垃圾回收器(GC)
一 概述
GC(Garbage Collection),在程序運(yùn)行過(guò)程中內(nèi)存空間是有限的,為了更好的的使用有限的內(nèi)存空間,GC會(huì)將不再使用的對(duì)象清除然后將其所占用的內(nèi)存釋放出來(lái)。
觸發(fā)GC的條件
1. 程序調(diào)用System.gc的時(shí)候觸發(fā)GC。
/** * Runs the garbage collector. * <p> * Calling the <code>gc</code> method suggests that the Java Virtual * Machine expend effort toward recycling unused objects in order to * make the memory they currently occupy available for quick reuse. * When control returns from the method call, the Java Virtual * Machine has made a best effort to reclaim space from all discarded * objects. * <p> * The call <code>System.gc()</code> is effectively equivalent to the * call: * <blockquote><pre> * Runtime.getRuntime().gc() * </pre></blockquote> * * @see java.lang.Runtime#gc() */ public static void gc() { Runtime.getRuntime().gc(); }
2. 系統(tǒng)自身決定GC的觸發(fā)時(shí)機(jī),主要根據(jù)Eden區(qū)和From Space區(qū)的內(nèi)存大小來(lái)決定,當(dāng)內(nèi)存大小不足時(shí),則會(huì)啟動(dòng)GC線程(Daemon線程)并停止應(yīng)用線程。
二 查看Java8的默認(rèn)GC
1.cmd命令行查看Java8的GC
java -XX:+PrintCommandLineFlags -version
結(jié)果如下:
-XX:InitialHeapSize=132397312 // JVM默認(rèn)初始化堆大小 -XX:MaxHeapSize=2118356992 //JVM堆的默認(rèn)最大值 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC //Java8使用的GC類型 java version "1.8.0_20" //使用的java版本 Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
結(jié)果分析:由結(jié)果可以看出Java8的GC情況是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代),實(shí)際上幾個(gè)主流Java版本的GC情況如下:
- jdk1.7 默認(rèn)垃圾收集器Parallel Scavenge(新生代【標(biāo)記-復(fù)制算法】)+Parallel Old(老年代【標(biāo)記整理算法】)
- jdk1.8 默認(rèn)垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
- jdk1.9 默認(rèn)垃圾收集器G1【從局部(兩個(gè)Region之間)來(lái)看是基于"標(biāo)記—復(fù)制"算法實(shí)現(xiàn),從整體來(lái)看是基于"標(biāo)記-整理"算法實(shí)現(xiàn)】
jdk1.7 默認(rèn)垃圾收集器Parallel Scavenge(新生代【標(biāo)記-復(fù)制算法】)+Parallel Old(老年代【標(biāo)記整理算法】)jdk1.8 默認(rèn)垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)jdk1.9 默認(rèn)垃圾收集器G1【從局部(兩個(gè)Region之間)來(lái)看是基于"標(biāo)記—復(fù)制"算法實(shí)現(xiàn),從整體來(lái)看是基于"標(biāo)記-整理"算法實(shí)現(xiàn)】
2.cmd命令行查看Java8的GC詳細(xì)情況
java -XX:+PrintGCDetails -version
結(jié)果如下:
java version "1.8.0_20" Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode) Heap PSYoungGen total 38400K, used 2678K [0x00000000d5e00000, 0x00000000d8880000, 0x0000000100000000) eden space 33280K, 8% used [0x00000000d5e00000,0x00000000d609dbc0,0x00000000d7e80000) from space 5120K, 0% used [0x00000000d8380000,0x00000000d8380000,0x00000000d8880000) to space 5120K, 0% used [0x00000000d7e80000,0x00000000d7e80000,0x00000000d8380000) ParOldGen total 87552K, used 0K [0x0000000081a00000, 0x0000000086f80000, 0x00000000d5e00000) object space 87552K, 0% used [0x0000000081a00000,0x0000000081a00000,0x0000000086f80000) Metaspace used 2257K, capacity 4480K, committed 4480K, reserved 1056768K class space used 244K, capacity 384K, committed 384K, reserved 1048576K
在Java中使用Metaspace(元空間)而移除了PermGenspace(永久區(qū))。也就意味著這部分內(nèi)存空間將全部移除。
設(shè)置JVM的參數(shù)PermSize和MaxPermSize時(shí)會(huì)被忽略并給出警告。
但是類的元數(shù)據(jù)信息(metadata)還在,只是不再存儲(chǔ)在連續(xù)的堆空間中,而是移動(dòng)到了被稱為"Metaspace(元空間)"的本地內(nèi)存(Native memory)中。
補(bǔ)充JDK1.6,JDK1.7與JDK1.9的信息
JDK1.6
-XX:InitialHeapSize=132397312 -XX:MaxHeapSize=2118356992 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.6.0_43" Java(TM) SE Runtime Environment (build 1.6.0_43-b01) Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) java version "1.6.0_43" Java(TM) SE Runtime Environment (build 1.6.0_43-b01) Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) Heap PSYoungGen total 37696K, used 646K [0x00000007d5e00000, 0x00000007d8810000, 0x0000000800000000) eden space 32320K, 2% used [0x00000007d5e00000,0x00000007d5ea19a8,0x00000007d7d90000) from space 5376K, 0% used [0x00000007d82d0000,0x00000007d82d0000,0x00000007d8810000) to space 5376K, 0% used [0x00000007d7d90000,0x00000007d7d90000,0x00000007d82d0000) PSOldGen total 86272K, used 0K [0x0000000781a00000, 0x0000000786e40000, 0x00000007d5e00000) object space 86272K, 0% used [0x0000000781a00000,0x0000000781a00000,0x0000000786e40000) PSPermGen total 21248K, used 2709K [0x000000077c800000, 0x000000077dcc0000, 0x0000000781a00000) object space 21248K, 12% used [0x000000077c800000,0x000000077caa5738,0x000000077dcc0000)
JDK1.7
-XX:InitialHeapSize=132397312 -XX:MaxHeapSize=2118356992 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) //1.7中的PSPermGen永久代到1.8中是Metaspace java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) Heap PSYoungGen total 38400K, used 1997K [0x00000007d5e00000, 0x00000007d8880000, 0x0000000800000000) eden space 33280K, 6% used [0x00000007d5e00000,0x00000007d5ff3480,0x00000007d7e80000) from space 5120K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d8880000) to space 5120K, 0% used [0x00000007d7e80000,0x00000007d7e80000,0x00000007d8380000) ParOldGen total 86016K, used 0K [0x0000000781a00000, 0x0000000786e00000, 0x00000007d5e00000) object space 86016K, 0% used [0x0000000781a00000,0x0000000781a00000,0x0000000786e00000) PSPermGen total 21504K, used 2222K [0x000000077c800000, 0x000000077dd00000, 0x0000000781a00000) object space 21504K, 10% used [0x000000077c800000,0x000000077ca2b8c0,0x000000077dd00000)
JDK1.9
-XX:G1ConcRefinementThreads=4 -XX:InitialHeapSize=132397312 -XX:MaxHeapSize=2118356992 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode) C:\Users\pengu>java -Xlog:Gc* -version [0.015s][info][gc,heap] Heap region size: 1M [0.021s][info][gc ] Using G1 [0.021s][info][gc,heap,coops] Heap address: 0x0000000081a00000, size: 2022 MB, Compressed Oops mode: 32-bit java version "9.0.4" Java(TM) SE Runtime Environment (build 9.0.4+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode) [0.123s][info][gc,heap,exit ] Heap [0.124s][info][gc,heap,exit ] garbage-first heap total 131072K, used 1024K [0x0000000081a00000, 0x0000000081b00400, 0x0000000100000000) [0.124s][info][gc,heap,exit ] region size 1024K, 2 young (2048K), 0 survivors (0K) [0.125s][info][gc,heap,exit ] Metaspace used 3453K, capacity 4480K, committed 4480K, reserved 1056768K [0.126s][info][gc,heap,exit ] class space used 352K, capacity 384K, committed 384K, reserved 1048576Kjava
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot發(fā)布dubbo服務(wù)注冊(cè)到nacos實(shí)現(xiàn)方式
這篇文章主要介紹了springboot發(fā)布dubbo服務(wù)注冊(cè)到nacos實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Java Set簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Set最大的特性就是不允許在其中存放的元素是重復(fù)的。接下來(lái)通過(guò)本文給大家分享java set常用方法和原理分析,需要的的朋友參考下吧2017-05-05PowerJob LockService方法工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob LockService方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01springBoot 整合ModBus TCP的詳細(xì)過(guò)程
ModBus是一種串行通信協(xié)議,用于從儀器和控制設(shè)備傳輸信號(hào)到主控制器或數(shù)據(jù)采集系統(tǒng),它分為主站和從站,主站獲取和編寫(xiě)數(shù)據(jù),從站則是設(shè)備,本文給大家介紹springBoot 整合ModBus TCP的詳細(xì)過(guò)程,感興趣的朋友一起看看吧2025-01-01詳解mall整合SpringBoot+MyBatis搭建基本骨架
這篇文章主要介紹了詳解mall整合SpringBoot+MyBatis搭建基本骨架,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08java跳出循環(huán)的三種方式總結(jié)(break語(yǔ)句、continue語(yǔ)句和return語(yǔ)句)
在實(shí)際編程中,有時(shí)需要在條件語(yǔ)句匹配的時(shí)候跳出循環(huán),下面這篇文章主要給大家介紹了關(guān)于java跳出循環(huán)的三種方式,其中包括break語(yǔ)句、continue語(yǔ)句和return語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2023-03-03