1、JVM 调优的参数可以在哪里设置参数值
war包部署在tomcat中设置:修改TOMCAT_HOME/bin/catalina.sh文件
jar包部署在启动参数设置:java -Xms512m -Xmx1024m -jar xxxx.jar
nohup == : 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
参数 & ==:让命令在后台执行,终端退出后命令仍旧执行。
2、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区的大小,来减少YGC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况去调优。
-XXSurvivorRatio=8,表示年轻代中的分配比率:survivor:eden = 2:8
4、 年轻代晋升老年代阈值
-XX:MaxTenuringThreshold=threshold
默认为15
取值范围0-15
5、设置垃圾回收收集器
通过增大吞吐量提高系统性能,可以通过设置并行垃圾回收收集器。
-XX:+UseParallelGC-XX:+UseParallelOldGC
-XX:+UseG1GC
3、JVM 调优的工具
命令工具
jps 进程状态信息
jstack 查看java进程内线程的堆栈信息
jmap 查看堆转信息,Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中
jhat 堆转储快照分析工具
jstat JVM统计监测工具,可以用来显示垃圾回收信息、类加载信息、新生代统计信息等。
可视化工具
jconsole 用于对jvm的内存,线程,类 的监控
VisualVM 能够监控线程,内存情况
4、Java内存泄露的排查思路
内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况
1、通过jmap或设置jvm参数获取堆内存快照dump
2、通过工具, VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
3、通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
4、找到对应的代码,通过阅读上下文的情况,进行修复即可
5、CPU飙高排查方案与思路?
1.使用top命令查看占用cpu的情况
2.通过top命令查看后,可以查看是哪一个进程占用cpu较高
3.使用ps命令查看进程中的线程信息
ps H -eo pid,tid,%cpu | grep 40940
4.使用jstack命令查看进程中哪些线程出现了问题,最终定位问题
jstack 40940 此处是进程id
十进制转换为十六进制
printf "%x\n" 40955