一.基础知识
JVM:java虚拟机
栈:解决程序的运行,如何执行,如何处理数据,负责处理java程序运行中的进程和程序处理逻辑,只能存储基本的数据类型和对堆中对象的引用。
堆:解决数据存储,怎么放,放在哪里
在java中,栈的理解:
栈内存私有,不能被其他线程访问,大小通过-Xss设置,空间不足时会出现Java.lang.StackOverflowError异常
堆内存所有线程共享
二。JVM堆内存结构
初始分配的内存-Xms和最大分配的内存-Xmx相等:
堆内存剩余<40%,JVM自动增大堆内存,直到最大
堆内存剩余>70%,JVM自动减少堆内存,直到最小
以避免每次GC后调整堆的大小,设置-Xms和-Xmx相等
1.堆内存划分
young:年轻代,Eden +S0 +S1,-Xmn
eden:伊甸园区,属于young,存放新生的对象
survivor space:属于young,存放区,有两个,存放每次eden区GC后存活的对象
old:老年代,存放生命周期长的存活对象
2.非堆内存
permannent:永久区,存放静态数据,代码
3.JVM内存申请
三。垃圾回收器
1.功能
分配内存
内存不被错误回收
回收垃圾对象
2.串行,并行收集器
串行收集器:适用单/多处理器机器,只处理单线程
并行收集器:适用多处理器机器
四。JVM性能监控分析调优
1.jps
类似于Linux下的ps,列出正在运行的虚拟机进程。
-m:输出传入main方法的参数
- l:输出main类或Jar的全限名
2.jmap
生成堆转储快照,查询finalize执行队列,Java堆,永久代的信息,属于时时数据
jmap -heap 进程ID
jmap -histo 进程ID
查看堆内存中的对象数量,大小,如果发生内存泄露,用这个方法可以快速定位
可以清楚的看到<constMethodKlass>占用率最大,调用次数最多
jmap -dump 进程ID
将内存的详细使用情况输出到文件,可以用MAT或者jhat查看
live:表示只dump堆中存活的对象
format=b:表示默认
file:文件名
jhat
分析java堆复制文件,启动一个允许堆中的对象在Web浏览器中进行分析的Web服务器
-J-Xmx:指定堆的大小,防止使用jhat命令是产生内存溢出
-port:端口号
当Server is ready 时,通过访问http://IP地址:Port来查看
jstat:
监控基于HotSpot的JVM,查看新生代,老生代,持久代的容量和使用情况,垃圾收集情况,垃圾回收次数,占用的时间
-gcutil:查看垃圾收集情况
9237:进程ID
3000:3S
每个3s打印一次,共打印6次堆内存的使用情况
jstack:
打印出给定的java进程ID,core file或远程调试服务的java栈信息。
此命令至少用三次,如果每次都指向同一个问题,才能确定问题。
jstack -l 进程ID
-l:打印关于锁的附加信息,显示进程中的所有的线程的信息。
java.lang.Thread.State表示此线程的状态,线程常见的状态如下:
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked
jconsole:
图形化的性能的监控工具,监控内容:桟内存,线程,CPU,类,VM信息
linux下配置jconsole监控tomcat
第一:在tomcat的bin目录下的catalina.sh,用vi编辑,在“Execute The Requested Command”前面粘上下面的内容
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=210.51.165.172
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
第二步:在/etc/sysconfig的iptables中加入下面的内容
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 9999 -j ACCEPT
第三步:在/etc下面的hosts将127.0.0.1改为210.51.165.172
第四部:重启tomcat
下面说说如何分析,如何使用这六个标签
概述: Displays overview information about the Java VM and monitored values.
内存: 显示内存使用信息
线程: 显示线程使用信息
类: 显示类装载信息
*VM摘要:*显示java VM信息
MBeans: 显示 MBeans.
概述:
概述很简单没啥说的,自己看看吧,不过值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。
内存:
这个比较有价值,参看堆内存,非堆内存,内存池的状况总体内存的分配和使用情况以及不同的GC进行垃圾回收的次数和时间。可以手动进行GC查看内存变化。
在分析JAVA内存问题进行调优时候非常有用,你要学习JVM内存模型,之后会发现这里的每个值都具有意义。
GC的算法和参数对性能有显著的影响,注意垃圾回收次数、时间、以及partial GC和full GC,调整你所使用的不同GC和以及各个GC下的参数,然后在这个视图下观察,以得到好的性能。
统计图显示的是线程数目的峰值(红色)和当前活动的线程(蓝色)。
另外下面有个按钮“检测到死锁”,有时候会有用处。