关于Linux 下的JVM调优请教,请高手赐教!
最近自己用SSH2开发后台的时候 项目运行久了经常报永久性内存溢出 :java.lang.OutOfMemoryError: PermGen space
看了很多资料 都说是在 tomcat/bin 目录下 设置catalina.sh 的 JAVA_OPTS 属性
但是我发现好像没有起作用
请问在linux 下能通过什么指令直接设置JVM的内存大小么
哪个指令可以查看JVM内存 谢谢!
[解决办法]
1.基本概念。
JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn512m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedOops
-server 启用能够执行优化的编译器。
-Xss 单个线程堆栈大小值。
-Xms 启动应用时,JVM堆空间的初始大小值。
-Xmx 应用运行中,JVM堆空间的极限值。
-Xmn 堆空间的新生代空间大小。
-XX:PermSize永久存储区的大小
2.VM性能诊断工具
基本工具:JPS ,JSTAT,JMAP
Jstat( “Java Virtual Machine statistics monitoring tool” )是JDK自带的一个轻量级小工具。主要对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
语法结构如下:jstat [Options] vmid [interval] [count]
Options -- 选项,我们一般使用 -gcutil 查看gc情况
vmid -- VM的进程号,即当前运行的java进程号
interval-- 间隔时间,单位为毫秒
count -- 打印次数,如果缺省则打印无数次
root@(none):~# jstat -gcutil 595
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 25.40 29.78 48.50 5 0.036 3 0.238 0.274
S0 -- Heap上的 Survivor space 0 区已使用空间的百分比
S1 -- Heap上的 Survivor space 1 区已使用空间的百分比
E -- Heap上的 Eden space 区已使用空间的百分比
O -- Heap上的 Old space 区已使用空间的百分比
P -- Perm space 区已使用空间的百分比
YGC -- 从应用程序启动到采样时发生 Young GC 的次数
YGCT-- 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC -- 从应用程序启动到采样时发生 Full GC 的次数
FGCT-- 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT -- 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
jmap
jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
使用方法
jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。
jmap -dump:format=b,file=f1 PID可以将该PID进程的内存heap输出出来到f1文件里。
集成工具: JConsole,jvisualvm
典型性能故障分析
2.vmstat
网上很多自己找了看.......