1.jvm跟踪设置
打印GC信息
-verbose:gc
-XX:+PrintGC
-XX:+PrintGCDetails 打印详细GC信息
-XX:+PrintGCTimeStamp打印GC发生的时间戳
Xloggc:log/gc.log 记录gc日志
-XX:+PrintHeapAtGC打印GC前后堆使用情况
-XX:+TraceClassLoading 监控类加载
-XX:+PrintClassHistogram 按下Ctrl+Break后打印所有类的使用情况
2.堆的分配参数设置
-Xmx20m -Xms5m ,意思是最大堆内存和分配20m,初始化分配5m,这样设置jvm就会通过gc来保证最小分配堆一一直尽量在5m,可能降低系统的性能,我们可以根据根据实际情况来设置初始化堆,jvm的最大堆和当前系统已分配的最大堆是不一样的。
-Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比
8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
jvm参数设置的例子
-Xmx20m -Xms20m -Xmn1m -XX:+PrintGCDetails
public class HeapTest { public static void main(String[] args) { byte[] b=null; for(int i=0;i<10;i++) b=new byte[1*1024*1024]; } }
堆栈信息:
Heap
PSYoungGen total 512K, used 0K [0x00000000fff00000, 0x0000000100000000, 0x0000000100000000)
eden space 0K, -2147483648% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 19456K, used 10855K [0x00000000fec00000, 0x00000000fff00000, 0x00000000fff00000)
object space 19456K, 55% used [0x00000000fec00000,0x00000000ff699fe8,0x00000000fff00000)
PSPermGen total 21504K, used 2520K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)
object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c763c8,0x00000000faf00000)
可以看出新生代的from和to个分配空间512k都没释放,老年代使用了10m空间,至于为什么新生代总空间是512k这点我现在还在迷糊,求解释。。。
下面我们调整下jvm参数:-Xmx20m -Xms20m -Xmn5m -XX:+PrintGCDetails
堆栈信息:
[GC [PSYoungGen: 3832K->504K(4608K)] 3832K->1552K(19968K), 0.0012854 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 3665K->504K(4608K)] 4713K->2576K(19968K), 0.0032564 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 3607K->504K(4608K)] 5679K->3608K(19968K), 0.0082467 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 4608K, used 1610K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
eden space 4096K, 27% used [0x00000000ffb00000,0x00000000ffc14820,0x00000000fff00000)
from space 512K, 98% used [0x00000000fff00000,0x00000000fff7e010,0x00000000fff80000)
to space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
ParOldGen total 15360K, used 3104K [0x00000000fec00000, 0x00000000ffb00000, 0x00000000ffb00000)
object space 15360K, 20% used [0x00000000fec00000,0x00000000fef08030,0x00000000ffb00000)
PSPermGen total 21504K, used 2520K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)
object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c763c8,0x00000000faf00000)
年轻代4608K,from区被使用了98%,老年代15360k使用了3104k使用了20%,方法区使用了11%
永久代参数设置
-XX:PermSize -XX:MaxPermSize
设置永久区的初始空间和最大空间
他们表示,一个系统可以容纳多少个类型
栈参数设置
-Xss
通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数 分配在栈上
栈的大小与程序的调用深度相关的,并不是栈越大越好,如果太大每个线程分配的空间过大,一个系统能启动的线程就会变少