jvm第二节-jvm参数设置和跟踪

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

决定了函数调用的深度

每个线程都有独立的栈空间

局部变量、参数 分配在栈上

栈的大小与程序的调用深度相关的,并不是栈越大越好,如果太大每个线程分配的空间过大,一个系统能启动的线程就会变少

猜你喜欢

转载自blueyan.iteye.com/blog/2276156