JVM/GC复习

JVM/GC

  • JVM(java虚拟机)
    • MAT
    • jstack(将正在运行的JVM的线程进行快照并且打印出来)
    • 死锁
    • VisualVM工具(监控线程内存使用情况)
    • JMX
  • GC
    • 垃圾回收算法
      • 1.引用计数法
      • 2.标记清除发
      • 3.标记压缩算法
      • 4.复制算法
      • 5.分代算法
    • 收集器
      • 1.串行垃圾收集器
      • 2.并行垃圾收集器
      • 2.CMS垃圾收集器
    • 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器
      • Young GC模式
      • Mixed GC
    • 可视化的GC日志分析工具

已更新完—有需要补充的请留言,大家一起学习

JVM(java虚拟机)

1.在生产环境中出现应用卡主的现象,日志不输出,程序没有反应
2.cpu占用过高
3.在多线程应用下,如何分配线程的数量
4.死锁
5.内存泄漏
等等

参数类型实例解释说明
标准参数-help很稳定,占时的JVM版本中都不会进行改变
-X参数(非标准参数)-Xint不稳定,在未来的一些版本中可能会进行一些改变
-XX参数(使用率较高)-XX:UseSerialGC再JVM的调优或者JVM的debugger中使用

//-showversion 参数表示先打印版本信息,再去执行后面的命令,再调试的时候非常有用
情况\参数-server-clinet
初始堆空间大一些小一些
默认回收器并行垃圾回收器串行垃圾回收器
启动速度
运行速度
32位操作系统(window)-默认
32位操作系统(其他)2GB以上的内存,2个以上的CPU默认否则选择该模式
64位操作系统不支持
// 进入根目录创建文件
mkdir /test
cd /test/
ll
vim TestJVM.java
//将刚刚的代码复制进去
    public static void main(String[] args) {
        String str = System.getProperty("str");
        if (str == null) {
            System.out.println("this str =null");
        } else {
            System.out.println(str);
        }
    }
//然后编译
javac TestJVM.java
//运行文件
java TestJVM
//设置里面的参数进行运行
java -Dstr=hello TestJVM
//结果如下

在这里插入图片描述

//按照刚刚的方式使用showversion,打印出来的就是显示版本号的基本进信息然后就是this str =null的信息
java -client -showversion TestJVM

java -server-showversion TestJVM

java -X

-X参数作用解释说明
-Xmixed混合模式执行 (默认)价格解释模式和编译迷失进行混合使用,由JVM自己决定,这是jvm的默认模式也是推荐模式
-Xint仅解释模式执行标记会强制JVM执行所有的字节代码,这样就会降低了运行速度,通常是低10倍以上
-Xcomp编译模式和Xint相反,jvm再第一次使用的时候会把所有的字节码编译到本地代码,从而大大的速度上的优化,但是很多应用在使用这个模式的时候都会有一些性能的损失.但是比使用-Xint损失少点,原因是他没有让JIT启动it编译器的全部功能,JIT编译器可以Udine是否需要编译做出判断,如果所有的代码都进行了编译,对于一些只执行一次代码就没有意义了
-Xbootclasspath<用 ; 分隔的目录和 zip/jar 文件>设置搜索路径以引导类和资源
-Xbootclasspath/a<用 ; 分隔的目录和 zip/jar 文件> 附加在引导类路径末尾
-Xbootclasspath/p<用 ; 分隔的目录和 zip/jar 文件>置于引导类路径之前
-Xdiag显示附加诊断消息
-Xnoclassgc禁用类垃圾收集
-Xincgc启用增量垃圾收集
-Xloggc:< file >将 GC 状态记录在文件中 (带时间戳)
-Xbatch禁用后台编译
-Xms< size >设置初始 Java 堆大小
-Xmx< size >设置最大 Java 堆大小
-Xss< size >设置 Java 线程堆栈大小
-Xprof输出 cpu 配置文件数据
-Xfuture启用最严格的检查, 预期将来的默认值
-Xrs减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni对 JNI 函数执行其他检查
-Xshare:off不尝试使用共享类数据
-Xshare:auto在可能的情况下使用共享类数据 (默认)
-Xshare:on要求使用共享类数据, 否则将失败。
-XshowSettings显示所有设置并继续
-XshowSettings:all显示所有设置并继续
-XshowSettings:vm显示所有与 vm 相关的设置并继续
-XshowSettings:properties显示所有属性设置并继续
-XshowSettings:locale显示所有与区域设置相关的设置并继续

-XX参数

类型格式实例
boolean类型-XX:[+ -]< name >表示启用或者禁用< name >属性-XX:DisableExplicitGC表示禁用手动调用GC操作,也就是说System.gc()无效
非boolean类型-XX:< name > =< value >表示< name >属性值为< value >-XX:NewRatio = 1表示新生代和老年代的比值

下面的属于-XX的参数范围

参数解释说明
-Xms设置JVM的堆内存初始大小
-Xmx设置JVM的堆内存最大大小
//比如运行下面的程序实例
java -Xms512m -Xmx2048m TestJVM

什么时候需要查看JVM的运行参数

1.运行java命令的时候打印出运行参数
运行java命令时候打印参数需要添加-XX:PrintFlagsFinal参数即可
实例:java -XX:PrintFlagsFinal TestJVM
在这里插入图片描述上面图的等于说明是默认值,如果显示的是:=说明是被修改之后的值
如果现在我想要将ZerroTLAB修改为true只需要这样就可以了
java -XX:PrintFlagsFinal -XX:+ZerroTLAB TestJVM

2.查看正在运行的java进程的参数
如果需要查看正在运行的jvm就需要借助月jinfo命令来进行查看
首先,启动一个tomcat用于测试来观察运行的jvm参数
cd /tmp/
rz 上传
tar -xvf apache-tomcat-7.0.57.tar.gz
cd apache-tomcat-7.0.57
cd bin/
./startup.sh
访问路径为:http://localhost:8080/


使用jps查看进程
使用jps -l 查看进程的全包名
查看所有的参数,用法:jinfo -flags < 进程id >
jinfo -flags 5269
在这里插入图片描述

jvm的内存模型
1.7版本
在这里插入图片描述
1.8版本
在这里插入图片描述在这里插入图片描述
可以看出1.8版本的组成为:年轻代 + 老年代
年轻代: Eden + 2个Survivor
老年代:OldGen
元数据空间:所占用的内存空间不是再虚拟机内部的,而是再本地内存空间中
在这里插入图片描述通过jstat命令进行查看堆内存的使用情况

jstat命令可以查看堆内存各个部分的使用量,以及加载类的数量格式如下:
jstat [-命令选项] [vmid][间隔时间/毫秒][查询次数]
查看class加载统计
jps
7080 jps
14440
jstat -class 14440
在这里插入图片描述

参数解释说明
Loaded加载class的数量
Bytes所占用的空间大小
Unloaded未加载数量
Bytes未加载占用的空间
Time总时间

查看编译统计
jstat -compilr 14440
在这里插入图片描述

参数解释说明
Compiled编译的数量
Failed失败数量
Invalid不可用数量
Time总时间
FailedType失败类型
FailedMethod失败的方法

垃圾回收统计
jstat -gc 14440
在这里插入图片描述
这里指的是每一秒打印一次一共打印5次
jstat -gc 14440 1000 5

参数解释说明
S0C第一个Survivor区的大小
S1C第二个Survivor区的大小
S0U第一个Survivor区的使用大小
S1U第二个Survivor区的使用大小
EUEden区的大小
ECEden区的使用大小
OCOld区的大小
OUOld区的使用大小
MC方法区大小
MU方法区使用大小
CCSC压缩类空间大小
CCSU压缩类空间使用大小
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收耗时时间
FGC老年代垃圾回收次数
FGCT老年代垃圾回收耗时时间
GCT垃圾回收耗时总时长

jmap的使用
查看内存的使用情况
jmap -heap 27472
在这里插入图片描述
查看内存中对象的数量以及大小
查看所有的对象,包括活跃的和非活跃的对象
jmap -histo < pid > | more
在这里插入图片描述

查看活跃的对象
jmap -histo:live < pid > | more
例如:jmap -histo:live: 27472 | more
在这里插入图片描述

对象说明
BBYTE
CCHAR
DDOUBLE
FFLOAT
IINT
JLONG
ZBOOLEAN
[数组例如:[I表示的就是int[]
[L+类名其他对象

MAT

将内存使用的情况dump到文件中
有时候需要将JVM当前的内存情况dump(快照)到文件中,然后针对这个文件进行分析,jmap的用法
jmap -dump:format=b,file=dumpFileName < pid >
例如:jmap -dump:format=b,file=H:\ dump.dat 27472
再使用jvm的导入到MAT工具中进行分析需要用到的参数是–当我们发生内存溢出的时候,将我们的内存使用情况进行一个快照(设置内存的初始内存大小,设置内存的最大内存大小)
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
在这里插入图片描述在这里插入图片描述生成的文件名就是上面图片提到的java_pid7600.hprof文件
在这里插入图片描述
使用MAT工具对dump文件进行分析
网址:https://www.eclipse.org/mat/

在这里插入图片描述打开文件
在这里插入图片描述
在这里插入图片描述选择之前的dump的文件
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

jstack(将正在运行的JVM的线程进行快照并且打印出来)

用法:
jstack < pid >
在这里插入图片描述
这里就是输出线程的执行情况
下面是线程的状态图
在这里插入图片描述

状态解释说明
初始状态(NEW)创建一个Thread对象,但是还没有调用start()启动线程时,线程处于初始状态
运行状态(Runnable)再java中,运行状态包括就绪状态和运行状态
运行状态(就绪状态)这个状态下的线程已经获取到了所要执行的资源,只需要分配CPU执行权即可执行,所有的就绪状态的线程都是存放在就绪队列中的
运行状态(运行状态)获取到CPU的执行权,正在执行线程,由于一个cpu同一时刻只能执行一个线程,所以每一个cpu每个时刻只有一条运行状态的线程
阻塞状态(Blocked)当每一个正在执行的线程请求某一条资源失败的时候就会进入阻塞状态,在java中阻塞状态专指请求锁失败时进入的状态,由于一个阻塞队列存放所有的阻塞状态的线程,处于阻塞状态的线程会不断的请求资源,一旦请求成功,就会进入就绪状态等待执行
等待状态(Waiting)当前线程中调用wait,join,park函数的时候,当前线程就会进入等待状态,也有一个等待的队列存放在所有的等待状态的线程;线程处于等待状态表示需要等待其他的线程的指示才能继续运行;进入等待状态的线程会释放CPU的执行权,并且释放资源(如:锁)
超时等待状态(Timed_Waiting)-当运行的线程调用sleep(time),wait,join,parkNanos,parkUntil的时候,就会进入到这个状态; 他和等待状态一样,并不是因为请求不到资源,而是主动的进入,并且进入后需要其他线程的唤醒;进入这个状态后释放CPU执行权和占有的资源; 与等待状态的区别就是,到了超时时间以后自动进入阻塞队列,开始竞争锁
终止状态(Terminated)线程执行结束后的状态

死锁

部署的应用程序没有任何反应了,中间也没有任何的输出
在这里插入图片描述在这里插入图片描述执行当前的代码然后通过jps获取当前的进程
之后使用jstack < pid > 来获取当前的代码的执行情况
在这里插入图片描述在这里插入图片描述这样就发现是出现了死锁的情况

VisualVM工具(监控线程内存使用情况)

在这里插入图片描述

这个工具是可以监控线程以及内存的使用情况,查看方法的CPU的时间和内存中的对象,已经被GC的对象,反向查看分配的堆栈(比如现在有100个String对象分别是有哪几个兑现分配出来的)

VisualVM命令

  • 内存信息
  • 线程信息
  • Dump堆(本地进程)
  • Dump线程(本地进程)
  • 打开对Dump,堆Dump可以用jmap来生成
  • 打开线程Dump
  • 生成应用快照(包含内存信息,线程信息等等)
  • 性能分析,CPU分析(各个方法调用时间,检查那些方法耗时长),内存分析(各类对象占用的内存,检查那些类占用的内存多)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述监控远程的JVM

JMX

是一个应用程序,设备,系统等植入管理功能的框架,JMX可以跨一系列的异构操作系统平台,系统体系和网络传输协议,灵活的开发无缝集成的系统,网络和服务管理应用
远程监控tomcat
再远程的tomcat添加一些参数
再tomcat的bin目录下修改catalina.sh添加如下的参数
JAVA_OPTS=
在这里插入图片描述
保存退出

在这里插入图片描述在这里插入图片描述

GC

垃圾回收:程序运行的时候必然需要申请内存的资源,无效的对象资源如果不及时进行处理的就会一直占用内存资源,最终导致内存溢出
java语言中有自动的垃圾回收机制就是GC

垃圾回收算法

1.引用计数法

原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败的时候,对象A的引用计数器就-1,如果对象A的计数器值为0,就是说明A没有被引用,可以被回收了


优点:
1.实用性较高,无需等到内存不够的时候,才可以进行回收,运行的时候根据对象的计数器是否为0,就可以直接进行回收了
2.在垃圾回收的过程中,引用无需挂起,如果申请内存的时候内存不足,则会立即outofmenber错误
3.区域性,更新对象的计数器的时候,只是影响到该对象,不会扫描全部的对象


缺点:
1.对象每次被引用的时候,都需要去更新计数器,有一定时间的开销
2.浪费cpu资源,即使是内存足够的情况下,任然运行时进行着计数器的统计
3.无法解决循环引用的问题(最大的缺点)

循环引用
A a = new A();
B b = new B();
a.b=b;
b.a=a;
a=null;
b=null;

2.标记清除发

是将垃圾护手分为2个阶段,分别为标记和清除
1.标记:从根节点开始标记引用的对象
2.清除:未被标记引用的对象就是垃圾回收对象,可以被清理
暂停程序线程,没有被标记的对象会被回收清除掉然后被标记的对象留下来并进行重置变为未标记的状态,恢复程序线程,程序继续运行


优点:
1.解决了循环引用的问题


缺点:
1.效率比较低,标记和清除2个动作都是需要遍历所有的对象,并且再GC的时候需要暂停应用程序,对于交互性要求高的应用而言这个体验是非常差的
2.通过标记清除的算法清理出来的内存,碎片化比较严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来内存是不连贯的

3.标记压缩算法

再标记清除算法的基础之上做的优化,和标记清除算法一样,也是从根节点开始,对对象的应用进行标记,在清理的阶段,并不是简单地清理未标记的对象,而是将存货的对象压缩到哦内存的一段,然后清理边界意外的垃圾,从而解决碎片化的问题
在这里插入图片描述


优点:解决了标记清除法里面而定碎片化问题
缺点:标记压缩算法多了一个压缩的步骤,这样就会导致其中的清除的整体效率受到了影响

4.复制算法

复制算法的核心是:将原有的内存空间一分为二,每次只用到其中的一块,在垃圾回收的时候,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换内存的角色,完成垃圾回收
如果内存的垃圾对象比较多的情况下需要复制的对象比较少,这种情况下是和使用这个方式并且效率比较高反之不适用
在这里插入图片描述


优点:
1.在垃圾对象多的情况下,效率高
2.清理以后,内存无碎片


缺点:
1.再垃圾对象少的时候不适合
2.分配的2块内存空间,再同一时刻只能使用一半,内存使用率较低

5.分代算法

分代算法指的是根据回收对象的特点进行选择,再jvm中,年轻代适合复制算法,老年代适合标记清除或者标记压缩算法

算法优点缺点说明
引用计数法1.实用性较高,无需等到内存不够的时候,才可以进行回收,运行的时候根据对象的计数器是否为0,就可以直接进行回收了 2.在垃圾回收的过程中,引用无需挂起,如果申请内存的时候内存不足,则会立即outofmenber错误 3.区域性,更新对象的计数器的时候,只是影响到该对象,不会扫描全部的对象1.对象每次被引用的时候,都需要去更新计数器,有一定时间的开销2.浪费cpu资源,即使是内存足够的情况下,任然运行时进行着计数器的统计 3.无法解决循环引用的问题(最大的缺点)假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败的时候,对象A的引用计数器就-1,如果对象A的计数器值为0,就是说明A没有被引用,可以被回收了
标记清除算法1.解决了循环引用的问题1.效率比较低,标记和清除2个动作都是需要遍历所有的对象,并且再GC的时候需要暂停应用程序,对于交互性要求高的应用而言这个体验是非常差的 2.通过标记清除的算法清理出来的内存,碎片化比较严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来内存是不连贯的是将垃圾护手分为2个阶段,分别为标记和清除1.标记:从根节点开始标记引用的对象2.清除:未被标记引用的对象就是垃圾回收对象,可以被清理;暂停程序线程,没有被标记的对象会被回收清除掉然后被标记的对象留下来并进行重置变为未标记的状态,恢复程序线程,程序继续运行
标记压缩算法解决了标记清除法里面而定碎片化问题标记压缩算法多了一个压缩的步骤,这样就会导致其中的清除的整体效率受到了影响再标记清除算法的基础之上做的优化,和标记清除算法一样,也是从根节点开始,对对象的应用进行标记,在清理的阶段,并不是简单地清理未标记的对象,而是将存货的对象压缩到哦内存的一段,然后清理边界意外的垃圾,从而解决碎片化的问题
复制算法1.在垃圾对象多的情况下,效率高 2.清理以后,内存无碎片1.再垃圾对象少的时候不适合 2.分配的2块内存空间,再同一时刻只能使用一半,内存使用率较低将原有的内存空间一分为二,每次只用到其中的一块,在垃圾回收的时候,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换内存的角色,完成垃圾回收
分代算法分代算法指的是根据回收对象的特点进行选择,再jvm中,年轻代适合复制算法,老年代适合标记清除或者标记压缩算法

收集器

参数说明
-XX:UseSerialGC指定的年轻代和老年代都使用串行垃圾收集器
-XX:+PrintGCDetails打印垃圾回收的详细信息
-XX:UseParallelGC年轻代使用ParallelGC垃圾回收期,老年代使用串行回收器
-XX:UseParallelOldGC年轻代使用ParallelGC垃圾回收期,老年代使用ParallelOld垃圾回收器
-XX:MaxGCPauseMillis(设置最大的垃圾收集时候的停顿时间,单位毫秒,需要注意的是ParallelGC为了达到设置的停顿时间,可能会调整堆的大小或者其他的参数,如果堆的大小设置的比较小,就会导致GC工作变得很频繁,反而可能会影响到性能,这个参数使用的时候需要谨慎处理)
-XX:GCTimeRatio(设置垃圾回收时间占程序运行时间的百分比,公式:1/(1+n),他的值为0~100之间的数字,默认值为99,也就是垃圾回收事假不能超过1%)
-XX:UseAdaptiveSizePolicy(自适应GC模式,垃圾回收器将会自动的调整新生代,老年代等参数,达到吞吐量,堆大小,停顿时间之间的平衡;一般用于手动的调整比较困难的场景,让收集器自动的进行调整)
-XX:+UseG1GC使用G1垃圾收集器
-XX:+MaxGCPauseMillis设置期望达到的最大GC停顿时间指标,默认是200毫秒,但是jvm不一定能保证达到这个指标
-XX:+ParallelGCthreads=n设置STW工作线程数的值,将n的值设置为逻辑处理器的值.n的值与逻辑处理器的数量相同,最多为8
-XX:+ConcGCThreads=n设置并行标记的线程数,将n设置为并行垃圾回收线程数的1/4左右
-XX:+G1HeapRegionSize设置的G1区域的大小,值是2的幂,范围是1mb~32mb之间,目标是根据最小dejava堆大小划分为≈2048个区域, 默认是堆内存的1/2000
-XX:+InitiatingHeapOccupancyPercent=n设置处罚标记周期的java堆占用率阀值,默认占用率是整个java堆的45%

在这里插入图片描述

参数解读冒号后面的内容解释
DefNew表示使用的是串行垃圾收集器4416K->512K(4928K)====>表示年轻代GC占用的内存是4416K内存,GC之后占用512K内存总大小4928K;0.0046102 secs =====>表示的是GC所用的时间单位毫秒 ;
-XX:+PrintGCDetails打印垃圾回收的详细信息

1.串行垃圾收集器

指的是单线程进行的垃圾回收,垃圾回收的时候只有一个线程在进行工作,并且java应用中的所有的线程都需要进行暂停,等待垃圾回收的完成这个现象叫做STW-----这个应用的场景特别少
在程序运行的过程中添加2个参数即可
1.-XX:+UseSerialGC(指定的年轻代和老年代都使用串行垃圾收集器)
2.-XX:+PrintGCDetails(打印垃圾回收的详细信息)
在这里插入图片描述

//设置堆的初始和最大内存值为16M  串行收集器
-XX:+UseSerialGC -XX:+PrintGCDetails -Xms16m -Xmx16m

2.并行垃圾收集器

并行的垃圾收集器再创航的垃圾收集器的基础上做的改进,将单线程改为多线程的垃圾回收,这样缩短回收的时间,这里的手机过程也是会暂停应用程序的


1.ParNew垃圾收集器
ParNew垃圾收集器是工作再年轻代上的,只是将串行的垃圾收集器改为并行的
通过:-XX:+UseParNewGC参数设置年轻代使用ParNew回收期,老年代使用的依然是串行收集器
在这里插入图片描述


2.ParallelGC垃圾收集器
ParallelGC收集器工作机制和ParNew收集器一样,只是在此基础上,新增了2个和系统吞吐量相关的参数,使得其使用起来更加的灵活和高效
相关参数:
-XX:UseParallelGC(年轻代使用ParallelGC垃圾回收期,老年代使用串行回收器)
-XX:UseParallelOldGC(年轻代使用ParallelGC垃圾回收期,老年代使用ParallelOld垃圾回收器)
-XX:MaxGCPauseMillis(设置最大的垃圾收集时候的停顿时间,单位毫秒,需要注意的是ParallelGC为了达到设置的停顿时间,可能会调整堆的大小或者其他的参数,如果堆的大小设置的比较小,就会导致GC工作变得很频繁,反而可能会影响到性能,这个参数使用的时候需要谨慎处理)
-XX:GCTimeRatio(设置垃圾回收时间占程序运行时间的百分比,公式:1/(1+n),他的值为0~100之间的数字,默认值为99,也就是垃圾回收事假不能超过1%)
-XX:UseAdaptiveSizePolicy(自适应GC模式,垃圾回收器将会自动的调整新生代,老年代等参数,达到吞吐量,堆大小,停顿时间之间的平衡;一般用于手动的调整比较困难的场景,让收集器自动的进行调整)

在这里插入图片描述

2.CMS垃圾收集器

是一款并发,使用标记清除算法的垃圾回收器该回收器是针对老年代垃圾回收的,通过参数-XX:+UseConcMarkSweepGC进行设置的
CMS垃圾回收器的执行过程如下
在这里插入图片描述
初始化标记:标记root,会导致stw(程序暂停上面有解释)
并发标记,与用户线程同时运行
预清理与用户线程同时运行
重新标记,会导致stw
并发清除,与用户线程同时运行
调整堆大小,设置CMS再清理之后进行内存压缩,目的是清理内存中的碎片
并发重置状态等待下次CMS的触发,与用户线程同时运行
在这里插入图片描述

3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器

G1的设计原则就是简化jvm性能调优,三步调优
1.开启G1垃圾收集器
2.设置堆的最大内存
3.设置最大的停顿时间
三种模式Young GC ,Mixed GC 和Full GC


相比于其他的垃圾收集器,最大的区别在于他取消了年轻代,老年代的物理划分,取而代之的是将堆划分为若干个区域,这些区域中包含了有逻辑上的年轻代和老年代区域
这样做的好处就是,不需要单独的空间对每一个代进行设置,不需要担心每个代内存是否足够的问题
在这里插入图片描述
在G1划分的区域中,年轻代的垃圾收集器依然是采用stw的方式,将存活对象拷贝到老年代或者Survivor空间,G1收集器通过将对象从一个区域复制到另外一个区域完成清理的工作
这就意味着在正常处理过程中,G1完成了堆的压缩,这样也就不会有cms内存碎片的问题存在了
Humongous
1.如果一个对象占用的空间超过了分区容量的50%以上,G1收集器就认为这是一个巨型对象
2.这些巨型对象,默认直接会被分配到老年代,但是如果他是一个短期存在的巨型对象,就会对垃圾收集器造成负面的影响
3.为了解决这个问题,G1划分了一个Humongous区,他是专门的存放巨型对象的,如果一个H村放不下巨型对象,那么就会寻找连续的H分区来进行存储,为了能找到连续的H区有时候就得启动Full GC

Young GC模式

在这里插入图片描述

主要是对Eden区进行GC,他在Eden空间耗尽时候会被触发
1.Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升为老年代空间
2.Survivor区的数据移动到新的Survivor区中,也会有部分的数据晋升为老年代空间中
3.最终Eden空间的数据为空,GC停止空间,应用线程继续执行

Mixed GC

当越来越多的对象晋升为老年代old region的时候,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,既 Mixed GC 这个算法并不是一个old GC 除了回收整个Young Region ,还会回收一部分的Old Region,这里需要注意的是:是一部分的老年代,而不是全部的老年代,可以选择那些old region进行收集,从而可以垃圾回收的耗时时间进行控制;也需要注意的是Mixed GC并不是Full GC
触发机制:参数:-XX:InitiatingHeapOccupancyPercent=n决定的,默认45%(当老年代大小占堆大小百分比达到这个阀值的时候触发)


GC2步:
1.全局并发标记
2.拷贝存活对象(evacuation)


全局并发标记5步
1.初始标记:标记从根节点直接到达对象,这个阶段会执行一次年轻化GC,会产生全局停顿
2.根区域扫描
G1 GC在初始标记的存活区扫描老年代的应用,并标记被引用的对象
该阶段与引用程序(非STW)同时运行,并且只有完成这个阶段的之后才能开始下一次STW年轻代垃圾回收
3.并发标记
G1 GC在整个堆查找可访问(存活的)对象,这个阶段与应用程序是同时运行的,可以被STW年轻代垃圾回收中断
4.重新标记
这个阶段指的是STW回收,因为程序再运行,针对上一次的标记正在修正
5.清除垃圾
清点和重置标记状态,这个阶段会STW,这个阶段并不会实际上去做垃圾的收集,等待evacuation阶段来回收
拷贝存活对象
evacuation阶段是全暂停的,这个阶段把一部分的Region里面的活对象拷贝到另一部分Region中,从而实现垃圾的回收清理在这里插入图片描述
在这里插入图片描述在这里插入图片描述

可视化的GC日志分析工具

日志打印在这里插入图片描述
生成log文件在这里插入图片描述
GC Easy可视化工具网址
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347397.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

一文了解prettier

简介 eslint和prettier都是用来做代码格式化的&#xff0c;他们其中又分为npm包和vscode插件&#xff0c;顺序是&#xff1a;先有npm包再有vscode插件 eslint限制工具 作用&#xff1a; 检查代码规范变量声明是否调用是否有console.log()语句… 用法 新建index.js文件 //…

MySQL数据库的锁机制

目录 一、引言 二、锁的类型及作用 2.1 行级锁 2.2 间隙锁与临键锁 2.3 共享锁与排他锁 2.4 意向锁 2.5 表级锁 2.6 元数据锁 三、锁的管理与优化 3.1 合理设置事务隔离级别 3.2 避免长事务 3.3 索引优化 3.4 明确锁定范围 3.5 避免不必要的全表扫描 四、实战分…

JDBC数据库连接

JDBC(Java DataBase Connectivity)就是用Java语言操作关系型数据库的一套API JDBC的步骤固定&#xff0c;大体分为8个步骤&#xff0c;以MySQL数据库为例 1.创建工程并导入驱动jar包 2.注册驱动 注册驱动的目的是告诉代码要执行哪一个jar包 Class.forName(com.mysql.jdbc.D…

多尺度特征融合13种创新方案全面汇总,含2024年最新

前段时间和大佬朋友交流学术的时候&#xff0c;发现目前发论文最好用的2大创新方式一是加注意力机制&#xff0c;二是多尺度特征融合。上回我们讲过了加注意力机制&#xff0c;今天我们就来聊聊多尺度特征融合。 多尺度特征融合是一种在图像处理和CV中使用的技术&#xff0c;由…

05-Seata下SQL使用限制

不支持 SQL 嵌套不支持多表复杂 SQL(自1.6.0版本&#xff0c;MySQL支持UPDATE JOIN语句&#xff0c;详情请看不支持存储过程、触发器部分数据库不支持批量更新&#xff0c;在使用 MySQL、Mariadb、PostgreSQL9.6作为数据库时支持批量&#xff0c;批量更新方式如下以 Java 为例 …

大创项目推荐 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的垃圾邮件分类 该项目…

网络协议与攻击模拟_09部署DHCP服务器

一、部署DHCP服务器 Windows server部署DHCP服务器 1、虚拟机网络架构理解 Vmware里面不同的虚拟机可以设置相同的Vmnet网络&#xff0c;也可以设置不同的Vmnet网络。两台虚拟机设置相同的Vmnet1网卡&#xff0c;可以看作为使用虚拟交换机将两台Vmnet1的虚拟机连接起来的。 …

在使用springboot框架式的的script无法通过${}来获取值

今天使用springboot框架做项目&#xff0c;想着来实现一下搜索的下拉框回显功能&#xff0c;然后就一直在报错误&#xff0c;关键是报的错误牛头不对马嘴&#xff0c;检查了一下后端代码&#xff0c;发现没什么问题&#xff0c;就把目光聚焦了.jsp页面的代码 <script type&…

xinput1_3.dll文件的几种修复办法以及修复xinput1_3.dll注意事项

xinput1_3.dll文件是DirectX的一部分&#xff0c;它在Windows系统中负责处理游戏控制器的输入。然而&#xff0c;有时候此文件可能会出现问题&#xff0c;导致游戏无法正常运行或启动。在本文中&#xff0c;将介绍多种解决xinput1_3.dll文件问题的方法&#xff0c;并对它们进行…

Linux本地部署MeterSphere测试平台并实现公网远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

Java项目:基于SSM框架实现同城蔬菜配送管理系统(SSM+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm825基于SSM框架实现同城蔬菜配送管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

Go Zero微服务个人探究之路(十)实战走通微服务前台请求调用的一套流程model->rpc微服务->apiHTTP调用

前言 Go语言凭借低占用&#xff0c;高并发等优秀特性成为后台编程语言的新星&#xff0c;GoZero框架由七牛云技术副总裁团队编写&#xff0c;目前已经成为Go微服务框架里star数量最多的框架 本文记录讲述笔者一步步走通前台向后台发出请求&#xff0c;后台api调用rpc服务的相…

【AI大模型】WikiChat超越GPT-4:在模拟对话中事实准确率提升55%终极秘密

WikiChat&#xff0c;这个名字仿佛蕴含了无尽的智慧和奥秘。它不仅是一个基于人工智能和自然语言处理技术的聊天机器人&#xff0c;更是一个能够与用户进行深度交流的智能伙伴。它的五个突出特点&#xff1a;高度准确、减少幻觉、对话性强、适应性强和高效性能&#xff0c;使得…

蓝桥杯备战——4.继电器/蜂鸣器

1.分析原理图 最好自己先去查查138以及ULN2003的使用方法&#xff0c;我这里直接讲思路。 由上图我们可以看到如果138输入ABC101,则输出Y50,此时若WR通过跳线帽接地则Y5C1 &#xff0c;于是573(U9)处于输出跟随输入P0状态&#xff0c;此时若P061&#xff0c;则573输出Q71&am…

ITSS服务工程师:开启IT职业生涯的金钥匙

&#x1f525;ITSS是中国电子技术标准化研究院推出的&#xff0c;涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求&#xff0c;还助力IT服务资质升级。 &#x1f3af;“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…

加载服务端发送的模型文件_unity开发进阶

加载服务端发送的模型文件 前言一、服务端搭建二、unity请求文件三、加载模型结语 前言 之前我们学习制作的都是离线状态下的东西&#xff0c;今天我们学习制作一个小demo。 内容就是我们用unity请求后台&#xff0c;接受后台发送过来的模型&#xff0c;然后将模型加载到场景中…

Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战&#xff0c;但实际上&#xff0c;Whisper的使用者完全可以针对中文的语音做一些优化的措施&#xff0c;换句话说&#xff0c;Whisper的“默认”形态可能在中文领域斗不过FunAsr&#xff0c;但是经过中文特殊优化的Whi…

面试官:请问泛型擦除、泛型上界、泛型下界、PECS原则 是什么?

什么是泛型 泛型的本质是 类型参数化&#xff0c;解决类型爆炸的问题。 所谓泛型是指将类型参数化&#xff0c;以达到代码复用提高软件开发工作效率的一种数据类型。 然后我们要定义一个盘子 plate&#xff0c;注意这个盘子除了 装入食物food之外&#xff0c;还可以装其他的…

【Kubernetes】深入了解Kubernetes(K8s):现代容器编排的引领者

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xf…