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里。