JVM

作者: Y了个J | 来源:发表于2021-03-30 00:40 被阅读0次

https://blog.csdn.net/weixin_37195606/article/details/82805216
https://blog.csdn.net/weixin_42392874/article/details/89483496
https://www.jianshu.com/p/a4ad53179df3

只要老年代的连续空间大于(新生代所有对象的总大小或者历次晋升的平均大小)就会进行minor GC,否则会进行full GC

如果一次 full GC 后,剩余对象不多,那么说明 Eden 的空间设置太小,导致大量短生命周期的对象被分配到了老生代。
如果一次 full GC 后,老生代的变化不大,那么是老年代分配空间太小了。

通过 top 命令查看 CPU 情况,如果 CPU 比较高,则通过 top -Hp <pid> 命令查看当前进程的各个线程运行情况。
找出 CPU 过高的线程之后,将其线程 id 转换为十六进制的表现形式,然后在 jstack 日志中查看该线程主要在进行的工作。

1.jstat -gc 【pid】查看gc情况,看gc次数和耗时
2.发现FullGC过多,通过 jmap -histo 【pid】查看堆中对象统计
jstat -gcutil 16671 1000
jstat -gccause 16671 1000
jmap -heap 11927
jmap -histo:live pid #只统计活的对象数量

输出jvm的heap内容到文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件
jmap -dump:live,format=b,file=myjmapfile.txt pid

finalizerinfo 打印正等候回收的对象的信息
jmap -finalizerinfo pid

可能导致 FULL GC 的类
当数据量很大时,LinkedBlockingQueue会无限制存放数据,最终导致Allocation Failure的Full GC。
使用Executors.newFixedThreadPool(nThreads)构造线程池处理消息,结果由于消息量很大,造成内存消耗过快,频繁FULL GC,其本质原因也是队列无限存放数据。

结合Young GC的信息和堆内存的使用情况,发现新生代的内存够用,老生代的内存不够用,频繁Full GC,老生代的内存使用率依旧达到了98%。

G1适合8/16G以上的内存使用,原因在于G1rescan更快,清除垃圾时虽然是stop the world但是可控,CMS虽然是并发但是不可控,大块内存要回收会影响到应用程序的性能。另外由于G1在清理垃圾时使用STW,所以可以采用标记整理算法,没有内存碎片问题

Cms是以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现。比较占用cpu资源,且易造成碎片。 G1是面向服务端的垃圾收集器,是jdk9默认的收集器,基于标记-整理算法实现。可利用多核、多cpu,保留分代,实现可预测停顿,可控。

新生代中一般采用复制算法,因为存活下来的对象是少数,所需要复制的对象少,而老年代对象存活多,不适合采用复制算法,一般是标记整理和标记清除算法。

因为复制算法需要留出一块单独的内存空间来以备垃圾回收时复制对象使用,
所以将新生代分为eden区和两个survivor区,每次使用eden和一个survivor区,
另一个survivor作为备用的对象复制内存区。

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
参数-XXSurvivorRatio是Eden区和单个Survior区的比例
所以(3+1+1)Survior=5012m,Eden大小为51203/5 m

JVM 中最大堆大小有三方面限制:
相关操作系统的数据模型(32-bt 还是 64-bit)限制;
系统的可用虚拟内存限制;
系统的可用物理内存限制。
32 位系统下,一般限制在 1.5G~2G;
64 为操作系统对内存无限制。在 Windows Server 2003 系统, 3.5G 物理内存, JDK5.0 下测试,最大可设置为 1478m。

持久代一般固定大小为 64m

-Xss128k: 设置每个线程的堆栈大小。 JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。
但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。

-XX:MaxTenuringThreshold=15,设置这个值大一点可以让对象尽量留在年轻代,年老代比较多的应用,这个值可以设小点,提高效率。

Sun官方建议年轻代的大小为整个堆的3/8左右
-XX:NewRatio=3: 设置年轻代和年老代的比值,1:3,年轻代占整个年轻代年老代和的 1/4
-XX:SurvivorRatio=4: 年轻代中 Eden 区与两个 Survivor 区的比值,就是4:1:1

相关文章

  • 深入JVM内核 目录

    深入JVM内核 目录 深入JVM内核1 初识JVM深入JVM内核2 JVM运行机制深入JVM内核3 常用JVM配置...

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • Jvm(一)-Java虚拟机的内存管理

    [toc] JVM JVM回顾 1. 什么是 JVM JVM是Java Virtual Machine(Java虚...

  • JVM介绍系列文章

    知晓JVM系列(一):对JVM总览知晓JVM系列(二):JVM内存管理机制与优化初探知晓JVM系列(三) :常用的...

  • 科普

    1.JVM/JRE/JDK关系JVM

  • JVM

    JVM之内存模型JVM之对象定位与访问JVM之Java垃圾回收机制JVM之类加载

  • JVM

    栈容量由-Xss指定深入理解JVM—JVM内存模型 JVM内存模型和JVM参数的关系

  • JVM基础知识系列

    JVM基础系列 JVM知识点扫盲系列(1) JVM知识点扫盲系列(2) JVM内存的那些事 JVM类加载的那些事 ...

  • (过时、作废)android 多线程 — GC

    简单解析下JVM 先说下 JVM,虽然上篇文章在讲内存时介绍了 JVM ,但是我在这里还是以 JVM 开头,JVM...

  • 技术文章罗列

    JVM JVM知识点详解JVM初步诊断JVM内存模型 Java Api java8 stream Api讲解(上)...

网友评论

      本文标题:JVM

      本文链接:https://www.haomeiwen.com/subject/gqsicltx.html