一. JVM的主要调优工具。
1.jsp 可以和UNIX的ps对比,查看虚拟机进程
2.jstat(JVM Statistics Monitoring Tool)监视各种领命状态的工具【-gc 监视java堆信息,包括Eden区,两个survivor,老年代,永久代,GC时间等】
3.jinfo:实时查看和调整虚拟机各项参数。
4.jmap:java内存映射工具【可以在虚拟机发生OOM异常之后自动生成dump文件】
5.jhat:虚拟机堆转存储快照分析工具【与jmap搭配】
6.jstack:java堆栈跟踪工具【线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就知道没有相应的线程到底在后台做什么,先通过jps查询LVMID来确定监控那个虚拟机进程,jstack -l LVMID】
关于线程状态需要关注的有;
死锁 Deadlock ;等待资源,Waiting on condition;等待获取监视器,Waiting on monitor entry;阻塞,Blocked(重点关注)
JDK可视化工具JConsole,可以看见主页面包括(概述,内存,线程,类)
VisualVM:随JDK发布的功能最强大的运行监视和故障处理程序。
二.案例分析
1.电销系统,开发用jpa连表查询多张数据量较大的表,返回List<大对象>,在查询过程中new了很多大对象,导致内存溢出,不得不两张表join,表对应关系由jdk处理,在sql查询时不要超过3表连表查询,效率比较低;网页卡顿,可采用方法,1.通过64位JDK来使用大内存,2.slb扩容,3.有些固定的结果的查询可用redis缓存
2.在线文档类型网站,访问文档序列化产生大对象,这些大对象进入老年代,没有在Minor GC中清理,内存很快被耗尽,导致每次GC会停顿一次GC的停顿时间。
3.服务器不稳定内存溢出,jstat发现Eden,Survier区,老年代和永久代都正常。最后是因为Direct Memory OutOfMemory.
4.不恰当的数据结构导致内存占用过大
5.JVM调优,设置堆栈内存
-Xms :表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。有可能真的按照这样的一个规则分配时,设计出的软件还没有能够运行得起来就挂了。
-Xmx: 表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。但是开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
-XX:newSize:表示新生代初始内存的大小,应该小于 -Xms的值;
-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于 -Xmx的值;
-Xmn:至于这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。
-XX:PermSize:表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)
-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
三. 排查outof memory error
1. 输入top命令
2. 导出dump文件的具体命令为:
jmap -dump:format=b,file=java.dump pid
3.JVM提供的基本命令即可解析此二进制dump文件。命令如下:
jhat java.dump
4.在浏览器输入此url 127.0.0.1:7000