java调优大概分为3个大类
1、 - 开头的标准参数
2、 -x 开头的非标准的参数 ,如 -xms 等等
3、-xx 开头的参数有728个参数
真正的jvm调优。调整的是-xx的参数
什么叫做jvm调优
将系统调整到最优的运行环境,共3中情况
1、预调优
2、优化jvm的运行环境
3、处理oom的问题,内存溢出会让内存越来越多,最后也会让内存爆掉。
oom内存调优的案例
如果我已经知道我的运行内存是多少的情况下,可以将xms最小内存和xmx最大内存设置成一样,放置内存抖动,直接给应用程序最大的内存设置
full gc 指全部内存的回收 gc 指年轻代内存的回收
jvm调优步骤
1、jps 查找正在运行的java进程
2、jinfo 加进程号(jinfo 17708),查看运行中的java所在许你记得详细情况
3、jstack 17708 列出java的堆栈的信息,可以列出来当前进程中有什么线程。
这个命令可以列出来程序之间的调用关系,当前线程的状态等信息,比如等待中。就可以通过这个命令查死锁了。
这里说明一下:定义线程名是要取名一个有意义的名字,不然jstack列出来了,也不清楚是什么地方出现了问题。
jmap
jvm调优工具 jconsole 、arthas 、jvisualvm
jarthas 详解
cpu部分
首先看一下是业务线程占用的cpu过高,还是系统线程占用的cpu过高
system 系统线程占用过高,应该是垃圾回收器忙不过来了
main 业务线程占用过高,需要关注业务中是不是有死循环出不来了
内存模块解释
heap 部分如下
ps_eden_space 伊甸园
ps_survivor_space 幸存者区
ps_old_gen 老年代
nonheap 部分如下
code_cache 代码缓存区
metaspace
compressed_class_space
jvm命令
jvm 可以看到使用的垃圾回收器是什么 ####thread 命令可以查看当前线程的信息 thread 线程号可以看到当前线程的调用信息 thread -b 可以查询关于死锁的线程信息
如何查看运行中程序哪些对象占用的内存比较多
1、使用arthas的heapdump命令可以导出环境中所有的对象占用的内存,然后导入visualvm可以查看。 2、使用jvm的原生命令,jmap -histo 2240 | head 20 总结 上面两个命令在生产环境上都不能用,只能在测试环境或者高可用或者备份机器上运行。artha需要导出文件,导出的文件很大。虽然jmap比artha不需要导出数据,但是也是需要暂停服务的。 所以在生产环境上可以使用配置参数解决问题,设置JVM启动参数 : -XX:+HeapDumpOnOutOfMemoryError参数可以让虚拟机在出现内存溢出异常时Dump出内存堆运行时快照。
如果我们在服务器中发现代码逻辑和自己的想法不一致怎么办,应急办法。
1、通过arthas可以通过jad命令对代码进行反编译,然后修改过代码对代码进行编译。 2、通过 redefibe 文件路径 , 对代码进行热加载。