• jvm实践


    说一下JVM中的分代回收

    堆的区域划分
    1.堆被分为了两份:新生代和老年代[1:2]
    2.对于新生代,内部又被分为了三个区域。Eden区,幸存者区survivor(分成from和to)[8:1:1]

    对象回收分代回收策略

    1.新创建的对象,都会先分配到eden区
    2.当伊园内存不足,标记伊园与from (现阶段没有)的存活对象
    3.将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和from 内存都得到释放
    4.经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
    5。当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升

    MinorGC、Mixed GC、 FullGC的区别是什么

    MinorGc[yogng GC]发生在新生代的垃圾回收,暂停时间短(STW)
    Mixed GC新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
    FullGC: 新生代+ 老年代完整垃圾回收,暂停时间 (STW),应尽力避免

    说一下JVM有哪些垃圾回收器?

    在jvm中,实现了多种垃圾收集器,包括:
    串行垃圾收集器: Serial G(新生代)、Serial Old GC(老年代)
    并行垃圾收集器: Parallel Old GC(新生代)、ParNew GCCMS(老年代)
    (并发)垃圾收集器: CMS GC,作用在老年代。并发、标记清理算法,停顿较少。
    G1垃圾收集器,作用在新生代和老年代

    强引用、软引用、弱引用、虚引用的区别?

    强引用:只要所有 GC Roots 能找到,就不会被回收
    软引用: 需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
    弱引用:需要配合WeakReference健用,只要进行了垃圾回收,就会把弱引用对象回收
    虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放外部内存,如直接内存

    JVM 调优的参数可以在哪里设置参数值

    JVM 调优的参数可以在哪里设置参数值
    war包部署在tomcat中设置修改TOMCAT_HOME/bin/catalina.sh文件
    jar包部署在启动参数设置 java -Xms512m -Xmx1024m -jar xxxx.jar

    JVM 调优的参数都有哪些?

    1、设置堆空间大小
    设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值

    -Xms:设置堆的初始化大小
    设置堆的最大大小Xmx:
    
    • 1
    • 2

    不指定单位默认为字节指定单位,按照指定的单位设置

    堆空间设置多少合适?

    最大大小的默认值是物理内存的1/4,初始大小是物理内存的1/64
    堆太小,可能会频繁的导致年轻代和老年代的垃圾回收,会产生stw,暂停用户线程堆内存大肯定是好的,存在风险,假如发生了fullgc,它会扫描整个堆空间,暂停用户线程的时间长设置参考推荐:尽量大,也要考察一下当前计算机其他程序的内存使用情况
    2、虚拟机栈的设置
    虚拟机栈的设置:每个线程默认会开启1M的内存,用于存放栈帧、调用参数局部变量等,但一般256K就够用。通常减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统

    -Xss 对每个线程stack大小的调整,-Xss128k
    
    • 1

    3、年轻代中Eden区和两个Survivor区的大小比例
    设置年轻代中Eden区和两个Survivor区的大小比例。该值如果不设置,则默认比例为8 1:1。通过增大Eden区的大小,来减少GC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时时间较长,因此需要按照程序情况调优

    XXSurvivorRatio=8表示年轻代中的分配比率: survivor:eden = 2:8
    
    • 1

    4、年轻代晋升老年代闯值

    XX:MaxTenuringThreshold=threshold
    
    • 1

    默认为15
    取值范围0-15

    5、设置垃圾回收收集器
    java 8默认的垃圾回收器是G1(Garbage First),它是一种分代回收器,能够更有效地回收内存

    -XX:+UseG1GC
    
    • 1

    G1会将Java堆分割成多个不同大小的区域,每个区域都有自己的垃圾回收周期。G1会根据这些区域中的垃圾收集情况,选择性地回收垃圾,以减少总体停顿时间。

    jvm调优的工具

    1、jps进程情况
    2、jstack查看进程中线程的堆栈信息,可以看有没有死锁

    jstack [option] 
    
    • 1

    3、jmap查看进程中的堆信息(用于生成堆转内存快照、内存使用情况):

    jmap -heap pid
    
    • 1
    Parallel GC with 8 thread(s)//并行的垃圾回收器
    MaxHeapSize= 8524922880 (8130.@MB)//堆空间允许的最大值
    NewRatio=2/新生代与老年代的堆空间比值,表示新生代: 老年代=1: 2
    SurvivorRatio=8 幸存者区比eden区的比例为1:1:8
    
    Heap Usage :Ps Young Generation
    Eden Space: //Eden使用情况
    From Space: //Survivor-From 使用情况:
    capacity = 22020896 (21.0MB)
    used(e.eMB)=0
    free=22028896 (21.6B)
    8.e% used
    
    To Space: //Survivor-to使用情况:
    
    old Generation//老年代 使用情况
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    jmap -dump:format=b,file=heap.hprof pid
    format=b表示以**hprof**二进制格式转储Java堆的内存
    file=用于指定快照dump文件的文件名
    
    
    • 1
    • 2
    • 3
    • 4

    4、jstat统计检测工具,用于显示垃圾回收信息,类加载信息,新生代的统计等

    jvm监控的可视化工具:

    1、jconsole用于对jvm的内存,线程,类的监控
    2、VisualVM能够监控线程,内存情况

    Java内存泄露的排查思路?

    内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况
    1、通过jmap或设置jvm参数获取堆内存快照dump:

    • 使用jmap命令获取运行中程序的dump文件 `imap -dump:format=b,file=heap.hprof pid``
    • 程序中断,需要设置VM参数,获取生成dump文件
    • -XX:+HeapDumpOnOutOfMemoryError XX:HeapDumpPath=/home/app/dumps/

    2、通过工具,VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
    3、通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
    4、找到对应的代码,通过阅读上下文的情况,进行修复即可

    CPU飙高排查方案与思路?

    1.使用top命令查看占用cpu的情况

    2.通过top命令查看后,可以查看是哪一个进程占用cpu较高

    top
    
    • 1

    3使用ps命令查看进程中的线程信息

    4.使用istack命令查看进程中哪些线程出现了问题,最终定位问题

    jstack 40940 此处是进程id.展示的全部线程id,但是是16进制
    十进制转换为十六进制
    printf "%x\n" 40955 
    
    • 1
    • 2
    • 3

    原文链接如下:https://blog.csdn.net/m0_57084845/article/details/134218672?spm=1001.2014.3001.5502。欢迎各位关注。

  • 相关阅读:
    Java日志框架Log4j 2详解
    Mybatis 缓存原理
    小程序常用组件小结
    努力前行,平凡的我们也能画出一条星光闪耀的轨迹——人大女王金融硕士项目
    java计算机毕业设计ssm党支部在线学习系统
    25 WEB漏洞-XSS跨站之原理分类及攻击手法
    凌恩客户文章|菜豆“不菜”——浙江省农科院新发现:菜用大豆和粮用大豆可能是独立训驯化
    NoSQL之 Redis配置
    JavaScript小技能: 应用程序接口
    Mybatis核心配置文件中的常用标签
  • 原文地址:https://blog.csdn.net/qq_52302919/article/details/134268605