java8中的默认垃圾回收器(GC)
作者:至学者 发布时间:2021-12-01 04:27:30
一 概述
GC(Garbage Collection),在程序运行过程中内存空间是有限的,为了更好的的使用有限的内存空间,GC会将不再使用的对象清除然后将其所占用的内存释放出来。
触发GC的条件
1. 程序调用System.gc的时候触发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. 系统自身决定GC的触发时机,主要根据Eden区和From Space区的内存大小来决定,当内存大小不足时,则会启动GC线程(Daemon线程)并停止应用线程。
二 查看Java8的默认GC
1.cmd命令行查看Java8的GC
java -XX:+PrintCommandLineFlags -version
结果如下:
-XX:InitialHeapSize=132397312 // JVM默认初始化堆大小
-XX:MaxHeapSize=2118356992 //JVM堆的默认最大值
-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)
结果分析:由结果可以看出Java8的GC情况是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代),实际上几个主流Java版本的GC情况如下:
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代【标记-复制算法】)+Parallel Old(老年代【标记整理算法】)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1【从局部(两个Region之间)来看是基于"标记—复制"算法实现,从整体来看是基于"标记-整理"算法实现】
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代【标记-复制算法】)+Parallel Old(老年代【标记整理算法】)jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)jdk1.9 默认垃圾收集器G1【从局部(两个Region之间)来看是基于"标记—复制"算法实现,从整体来看是基于"标记-整理"算法实现】
2.cmd命令行查看Java8的GC详细情况
java -XX:+PrintGCDetails -version
结果如下:
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(永久区)。也就意味着这部分内存空间将全部移除。
设置JVM的参数PermSize和MaxPermSize时会被忽略并给出警告。
但是类的元数据信息(metadata)还在,只是不再存储在连续的堆空间中,而是移动到了被称为"Metaspace(元空间)"的本地内存(Native memory)中。
补充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
来源:https://blog.csdn.net/calm_encode/article/details/106621152
猜你喜欢
- hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 本文实例讲述了Java定义泛型方法。分享给大家供大家参考,具体如下:一 点睛1 如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类
- 前言本文主要演示一个普通 java 项目导入IDEA的流程步骤及可能出现的问题、原因及解决办法。本文使用的部分软件版本如下:IDEA 201
- MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作。为什么要
- 在Spring MVC中想要对每一个URL进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了。代码如下: /** &nb
- Ctrl+1 快速修复Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当
- 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax 时,在后台将数据封装为 JSON 字符串更是常见。之前在做项目的时候
- Java的源代码是以*.java的纯文本文件,可以使用任何文本编辑器来进行编写,但是这个源代码是无法执行的。执行源代码的这个任务就需要JDK
- 本文为大家分享了CentOS 7下安装JDK8的详细步骤,供大家参考,具体内容如下一、下载JDK 至oracle官网下载,如图所示二、安装J
- 1.配置多个数据源多个数据源是指在同一个系统中,用户数据来自不同的表,在认证时,如果第一张表没有查找到用户,那就去第二张表中査询,依次类推。
- 一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类。在一个类中创建另外一个类,
- 标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者
- Equals和GetHashCodeEquals每个实现都必须遵循以下约定:自反性(Reflexive): x.equals(x)必须返回t
- 前言A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中通过二维数组构建的一个迷宫,“%”
- 先来个效果图觉得不好看可以自己调整1.绘制数据点线状图一般由数据点和连线组成在绘制连线之前,我们先标出数据点这里我选择用Image图片来绘制
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- IO操作字节流java.io.InputStream 输入流,主要是用来读取文件内容的。java.io.OutputStream 输出流,主
- 本文实例讲述了Java matches类,Pattern类及matcher类用法。分享给大家供大家参考,具体如下:Pattern类正则表达式
- --DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1