JVM虚拟机相关知识

一、常用JDK监控和故障的处理工具

命令用途
jps显示指定系统内所有的虚拟机进程
jstat用于收集虚拟机各方面的运行数据
jinfo显示虚拟机配置信息
jmap生成虚拟机快照
jhat用于分析heapdump文件,会建立一个http/html服务器,可以在浏览器上查看分析结果
jstack显示虚拟机快照

二、常用 JVM 参数:

参数说明
-Xms

-Xms为JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。

默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation来指定这个比列。

-Xmx-Xmx 为JVM运行时可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation来指定这个比列
-Xmn

新生代的内存空间大小,

注意:此处的大小是(eden+ 2 survivor space),与jmap -heap中显示的New gen是不同的,[整个堆大小=新生代大小 + 老生代大小 + 永久代大小]。

在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-XX:SurvivorRatio新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize

设置永久代(perm gen)初始值。默认值为物理内存的1/64。

表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)

-XX:MaxPermSize设置持久代最大值。默认为物理内存的1/4
-XX:SurvivorRatio=8年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1

        为了避免每次GC后JVM重新分配内存,JVM可将-Xms和-Xmx设为相同值

在这里插入图片描述

三、JVM内存模型及配置参数

名称

特征

作用

配置参数

异常

程序计数器

占用内存小,线程私有,

生命周期与线程相同

大致为字节码行号指示器

虚拟机栈

线程私有,生命周期与线程相同,使用连续的内存空间

Java 方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息

-Xss

StackOverflowError

OutOfMemoryError

java堆

线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址

保存对象实例,所有对象实例(包括数组)都要在堆上分配

-Xms

-Xsx

-Xmn

OutOfMemoryError

方法区

线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

-XX:PermSize:

16M

-XX:MaxPermSize

64M

OutOfMemoryError

运行时常量池

方法区的一部分,具有动态性

存放字面量及符号引用

四、垃圾回收器查看命令

1、打印的GC日志的新生代、老年代名称及使用百分比

java -XX:+PrintGCDetails -version

 2、

java -XX:+PrintCommandLineFlags

java -XX:+PrintCommandLineFlags -version

jdk1.8默认的垃圾回收器:Parallel Scavenge(年轻代)+ParallelOld(老年代)

五、在驱动程序和执行程序中配置垃圾回收设置的方法

spark-submit 
    --master spark://192.168.60.20:7077 \
    --conf "spark.driver.extraJavaOptions=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
    --conf "spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
 /appdata/bblite-codebase/test.py

六、Minor GC 触发时机

  • HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1。大多数情况下,对象优先在Eden区中分配。
  • 当Eden区中没有足够空间进行分配时,将会触发一次Minor GC

七、减少Full GC的方法

1、方法区空间增大
2、老年代空间增大
3、新生代空间减小
4、禁止使用System.gc()方法(或者少使用)
5、使用标记-整理算法,尽量让连续空间保持最大
6、排查代码中的无用大对象(内存泄漏)
7、不再使用对象及时清空/释放内存, 比如引用变量a,清空a, a=null

FullGC问题

FullGC,会触发Stop-The-World机制简称STW。是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。

STW是Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。

八、七种垃圾回收器总结

说明:

G1将就是把javad堆内存拆分为多个大小相等的Region,可(-XX:MaxGCPauseMillis)自定义设置垃圾回收的预期停顿时间(默认值是 200 ms)。

JDK1.8 默认GC回收器为Parallel Scavenge(新生代)+Parallel Old(老年代)

JDK1.9 默认垃圾收集器G1

G1相关参数:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC        #开启
-XX:MaxGCPauseMillis =50                  #暂停时间目标
-XX:GCPauseIntervalMillis =200          #暂停间隔目标
-XX:+G1YoungGenSize=512m            #年轻代大小
-XX:SurvivorRatio=6                            #幸存区比例

Garbage Collector垃圾收集器发展史:

  • 1993 年随 JDK 1.3.1 一起来的是串行方式的 Serial GC,它是第一款 GC。ParNew 垃圾收集器是 Serial 收集器的多线程版本。
  • 2002 年 2 月 26 日,Parallel GC 和 Concurrent Mark Sweep GC 跟随 JDK 1.4.2 一起发布。
  • Parallel GC 在 JDK 6 之后成为 HotSpot 默认 GC。
  • 2012 年,在 JDK 1.7u4 版本中,G1 可用。
  • 2017 年,JDK 9 中 G1 变成默认的垃圾收集器,以替代 CMS。
  • 2018 年 3 月,JDK 10 中 G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
  • 2018 年 9 月,JDK 11 发布。引入 Epsilon 垃圾回收器,又被称为 ”No-Op“(无操作)
  • 2019 年 3 月,JDK 12 发布。增强 G1,自动返回未用堆内存给操作系统。同时,引入 Shenandoah GC,是一个低停顿时间的 GC(Experimental)。
  • 2019 年 9 月,JDK 13 发布。增强 ZGC,自动返回未用堆内存给操作系统。
  • 2020 年 3 月,JDK 14 发布。删除 CMS 垃圾回收器。拓展 ZGC 在 macOS 和 Windows 上的应用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值