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

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

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

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

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

XX:MaxTenuringThreshold=threshold

默认为15
取值范围0-15

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

-XX:+UseG1GC

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

jvm调优的工具

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

jstack [option] <pid>

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

jmap -heap pid
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//老年代 使用情况
jmap -dump:format=b,file=heap.hprof pid
format=b表示以**hprof**二进制格式转储Java堆的内存
file=<filename>用于指定快照dump文件的文件名

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是JDK8 JVM配置的最佳实践: 1. 堆内存大小设置:应该根据应用程序的需求和场景来设置堆内存大小。设置过小会导致OutOfMemoryError,设置过大会浪费系统资源。一般建议将堆内存设置在物理内存的一半到三分之二之间。 2. 新生代和老年代的比例设置:新生代和老年代的比例设置对垃圾回收的性能影响很大。一般建议将新生代和老年代的比例设置为1:2或1:3。 3. 垃圾回收器的选择:JDK8提供了G1垃圾回收器和CMS垃圾回收器两种选择。G1适用于大堆内存和多核CPU,而CMS适用于低延迟场景。应该根据应用程序的需求来选择合适的垃圾回收器。 4. 线程数设置:JVM的垃圾回收器是多线程的,线程数的设置会影响垃圾回收的性能。一般建议将线程数设置为CPU核数的一半到三分之二之间。 5. 元空间大小设置:JDK8中使用元空间代替了永久代。元空间的大小应该根据应用程序的需求和场景来设置,一般建议将元空间设置为物理内存的十分之一。 6. GC日志设置:GC日志可以帮助我们分析和优化垃圾回收的性能。可以通过设置-XX:+PrintGC和-XX:+PrintGCDetails参数来输出GC日志。 7. 调整参数:还可以调整一些其他参数来优化JVM的性能,例如关闭Java应用程序的本地内存分配、调整JIT编译器的参数等。 需要注意的是,JDK8 JVM配置的最佳实践是根据应用程序的需求和场景来确定的,需要进行实验和测试来确定最佳的配置方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值