shell 脚本的参数配置
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
// 内存分析
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
Java visualVm 操作
1.链接配置
2.常用操作
2.1 内存泄漏
内存泄漏:对象不在回收树上,无法回收。 内存溢出:内存对象太多,内存放不下。
根据dump日志,查询占用最多的对象,然后分析
2.2 线程泄漏和线程移除
线程泄漏:指系统中动态分配的线程,在使用完毕后未关闭,导致相关资源未释放,结果导致一直占据系统资源,直到系统结束。直白点说,就是线程使用完毕后没有关闭或者正常停止,即线程泄漏。
线程溢出:指系统中达到了线程分配的极限,无法再创建新的线程时,还在收到新创建线程的请求,无法创建的一种状态,即线程溢出。
线程高位运行,就是问题。
查看最多的线程,然后判断,看代码。
2.3 查看方法耗时
启动 VisualVM,在应用程序窗口,选择对应的JAVA应用,在详情窗口》线程标签(勾选线程可视化),查看线程生命周期状态,主要留意线程生命周期中红色部分。
(1)绿色:代表运行状态。一般属于正常情况。如果是多线程环境,生产者消费者模式下,消费者一直处于运行状态,说明消费者处理性能低,跟不上生产者的节奏,需要优化对应的代码,如果不处理,就可能导致消费者队列阻塞的现象。对应线程的【RUNNABLE】状态。
(2)蓝色:代表线程休眠。线程中调用Thread.sleep()函数的线程状态时,就是蓝色。对应线程的【TIMED_WAITING】状态。
(3)黄色:代表线程等待。调用线程的wait()函数就会出现黄色状态。对应线程的【WAITING】状态。
(4)红色:代码线程锁定。对应线程的【BLOCKED】状态。
发现死锁,然后解决死锁
参考链接
https://blog.csdn.net/chwshuang/article/details/44203537
来源:oschina
链接:https://my.oschina.net/u/3421984/blog/4294045