jstack, jconsole, jinfo, jmap, jdb, jstat

-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime

 

java -verbose:gc -Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 -XX:+PrintGCD
etails  MinorGCTest

 

 

-XX:PretenureSizeThreshold

//allocate directly on Old Generaion, good for big object

-XX:MaxTenuringThreshold -XX:PrintTenuringDistribution

-XX:HandlePromotionFailure

 

 

 

 

 

 

 

 

public class MinorGCTest {

	/**
	 * -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime  
	 */
	public static void main(String[] args) {
		System.out.println(_1MB*3);
		//MinorGCTest.testAllocation();
		//MinorGCTest.testPretenureSizeThreshold();
		MinorGCTest.testOutMomery();
		
	}
	
	private static final int _1MB = 1024*1024;
	/**
	 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails
	 */
	public static void testAllocation() {
		byte[] allocation1, allocation2, allocation3, allocation4;
		allocation1 = new byte[2 * _1MB];
		allocation2 = new byte[2 * _1MB];
		allocation3 = new byte[2 * _1MB];
		allocation4 = new byte[4 * _1MB];
	}
	
	/**
	 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3145728 -XX:+PrintGCDetails 
	 */
	public static void testPretenureSizeThreshold() {
		byte[] allocation;
		allocation = new byte[4 * _1MB];
	}
	
	/**
	 * -verbose:gc -Xms10M -Xmx10M -Xmn5M -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:ErrorFile=C:/temp/yw04009/D_YW/code/java_error_%p.log
	 */
	public static void testOutMomery() {
		byte[] allocation;
		allocation = new byte[10 * _1MB];
	}

}

 

 

 

 

 

 

 

 

 

 

 

如果有一个严重的错误引起Java进程非正常退出,我们叫Crash,这时候会产生一个日志文件。缺省情况下,这个

文件会产生在工作目录下。但是,可以在Java启动参数通过下面的设置,来改变这个文件的位置和命名规则。例如:
java -XX:ErrorFile=/var/log/java/java_error_%p.log
就将这个错误文件放在/var/log/java下,并且以java_error_pid.log的形式出现。

 

 看jvm的gc日志,在catalina.sh文件中加入jvm参数:

-Xloggc:gclog.vgc -XX:+PrintGCTimeStamps -XX:-PrintGCDetails -XX:+UseConcMarkSweepGC

 

 

 

 


Young垃圾回收(GC)的产生过程


    1)新生成的对象在Eden区完成内存分配



    2)当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收。(为什么是eden+1survivor:两个survivor中始终有一个survivor是空的,空的那个被标记成To Survivor)



    3)minorGC时,Eden不能被回收的对象被放入到空的survivor(也就是放到To Survivor,同时Eden肯定会被清空),另一个survivor(From Survivor)里不能被GC回收的对象也会被放入这个survivor(To Survivor),始终保证一个survivor是空的。(MinorGC完成之后,To Survivor 和 From Survivor的标记互换)



    4)当做第3步的时候,如果发现存放对象的那个survivor满了,则这些对象被copy到old区,或者survivor区没有满,但是有些对象已经足够Old(通过XX:MaxTenuringThreshold参数来设置),也被放入Old区



    5)当Old区被放满的之后,进行完整的垃圾回收,即 Full GC



    6)Full GC时,整理的是Old Generation里的对象,把存活的对象放入到Permanent Generation里。