JVM

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JVM脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

JVM内存模型

 

JVM

 

 

Java内存模型规定所有变量都存储在主内存中,每个线程还有自己的工作内存

JMM决定一个线程对变量的写入何时对另一个线程可见。

 

GC回收算法

1、复制清除算法 Copinng

​ 将内存划分为两部分,每次使用一部分,将存活的对象复制到另一部分,再将该部分对象清除

​ 可用内存小

2、标记清除算法 Mark-Sweep

​ 分为标记阶段和清除阶段,本次标记,下次清除

​ 内存碎片化

3、标记整理算法 Mark-Compact

​ 将存活对象移动到一边,清除这个边界以外的对象

​ 若移动次数多,效率低

4、分代收集算法

 

GC垃圾回收

GC:负责无用数据回收的垃圾回收器

可达性分析算法:通过GC Root对象作为起点进行搜索,如果GC Root和一个对象之间没有可达路径,则该对象是不可达的。不可达对象不一定成为可回收对象

 

JVM内存结构

JVM

 

 

 

堆的内存划分

JVM

 

 

 

1)Minor GC:从年轻代(包括Eden、Survivor区)回收内存。

​ A、当JVM无法为一个新的对象分配内存的时候,越容易触发Minor GC。所以分配率越高,内存越来越少,越频繁执行Minor GC​ B、执行Minor GC操作的时候,不会影响到永久代(Tenured)。从永久代到年轻代的引用,被当成GC Roots,从年轻代到老年代的引用在标记阶段直接被忽略掉。

2)Major GC:清理整个老年代,当eden区内存不足时触发。

3)Full GC:清理整个堆空间,包括年轻代和老年代。当老年代内存不足时触发

 

 

 

JVM优化

  • 年轻对象放在eden区,当第一次GC后,如果对象还存活,放到survivor区,此后,每GC一次,年龄增加1,当对象的年龄达到阈值,就被放到tenured老年区。-XX:MaxTenuringThreshold阈值设置。如果想让对象留在年轻代,可以设置比较大的阈值。

  • 通过设置合理的eden区,survivor区及使用率,可以将年轻对象保存在年轻代,从而避免full GC,使用-Xmn设置年轻代的大小

  • 占用内存比较多的对象,在老年代为其分配内存。若在年代为其分配内存,年轻代内存不够,就要在Eden区移动大量对象到老年代,但这些对象可能很快消亡,导致 full GC

  • 设置最小堆和最大堆:-Xmx-Xms稳定的堆大小堆垃圾回收是有利的。

    • 获得一个稳定的堆大小的方法是设置-Xms和-Xmx的值一样,即最大堆和最小堆一样,如果这样子设置,系统在运行时堆大小理论上是恒定的,稳定的堆空间可以减少GC次数,因此,很多服务端都会将这两个参数设置为一样的数值。

    • 稳定的堆大小虽然减少GC次数,但是增加每次GC的时间,因为每次GC要把堆的大小维持在一个区间内。

  • 一个不稳定的堆并非毫无用处。在系统不需要使用大内存的时候,压缩堆空间,使得GC每次应对一个较小的堆空间,加快单次GC次数。基于这种考虑,JVM提供两个参数,用于压缩和扩展堆空间。

    • -XX:MinHeapFreeRatio 参数用于设置堆空间的最小空闲比率。默认值是40,当堆空间的空闲内存比率小于40,JVM便会扩展堆空间

    • -XX:MaxHeapFreeRatio 参数用于设置堆空间的最大空闲比率。默认值是70, 当堆空间的空闲内存比率大于70,JVM便会压缩堆空间。

    • 当-Xmx和-Xmx相等时,上面两个参数无效

  • 通过增大吞吐量提高系统性能,可以通过设置并行垃圾回收收集器。

    • -XX:+UseParallelGC:年轻代使用并行垃圾回收收集器。这是一个关注吞吐量的收集器,可以尽可能的减少垃圾回收时间。

    • -XX:+UseParallelOldGC:设置老年代使用并行垃圾回收收集器。

  • 尝试使用大的内存分页:使用大的内存分页增加CPU的内存寻址能力,从而系统的性能。-XX:+LargePageSizeInBytes 设置内存页的大小

  • 使用非占用的垃圾收集器。-XX:+UseConcMarkSweepGC老年代使用CMS收集器降低停顿。

  • -XXSurvivorRatio=3,表示年轻代中的分配比率:survivor:eden = 2:3

  • JVM性能调优的工具:

    • jps(Java Process Status):输出JVM中运行的进程状态信息(现在一般使用jconsole)

    • jstack:查看java进程内线程的堆栈信息。

    • jmap:用于生成堆转存快照

    • jhat:用于分析jmap生成的堆转存快照(一般不推荐使用,而是使用Ecplise Memory Analyzer)

    • jstat是JVM统计监测工具。可以用来显示垃圾回收信息、类加载信息、新生代统计信息等。

    • VisualVM:故障处理工具

 

 

类加载机制

 ...

 

 

 

 

 

参考链接:https://segmentfault.com/a/1190000014395186

 

脚本宝典总结

以上是脚本宝典为你收集整理的JVM全部内容,希望文章能够帮你解决JVM所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: