文章目录

  • 打印虚拟机信息命令集合
  • 关于对象晋升到老年代的场景
  • 关于空间分配担保的场景
  • 关于动态年龄判定的场景
  • 内存测试代码


打印虚拟机信息命令集合

-XX:+PrintCommandLineFlags ## 查看默认的虚拟器参数配置(例如:查看当前默认的垃圾收集器)
-XX:+PrintGCDetails ## 打印GC信息,配合-verbose参数能格式化打印出详细GC信息
-verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息
1.java -verbose:class
在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX (XXX为程序名)你会在控制台看到加载的类的情况。
//
2.java –verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下: [Full GC 268K->168K(1984K), 0.0187390 secs] 该参数用来监视虚拟机内存回收的情况。
[Full GC 168K->97K(1984K), 0.0253873 secs]
机器的环境为,Windows 2000 + JDK1.3.1,箭头前后的数据168K和97K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有168K-97K=71K的对象容量被回收,括号内的数据1984K为堆内存的总容量,收集所需要的时间是0.0253873秒(这个时间在每次执行的时候会有所不同)。
//
3.java –verbose:jni
-verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
在虚拟机调用native方法时输出设备显示信息,格式如下: [Dynamic-linking native method HelloNative.sum … JNI] 该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。

GC日志中名词解释 DefNew - - - Default New Generation Tenured - - - Old ParNew - - - Parallel New Generation PSYoungGen - - - Parallel Scavenge ParOldGen - - - Parallel Old Generation

java获取当前jvm地址 java获取jvm参数_开发语言

关于对象晋升到老年代的场景

个人认为一般有三种情况:

  1. 对象在新生代中存活大到年龄阈值N(N最大且默认为15,这个值可通过-XX:MaxTenuringThreshold=<年龄>设置)后晋升到老年代。
  2. 触发一次Minor GC后,一个survivor区域放不下时(老的Survivor对象+新增Eden对象)触发“内存担保”晋升到老年代。
  3. 大对象直接分配到老年代,可避免对象在新生代中反复负值浪费性能*(目前的新生代GC收集器都是基于“标记-复制”算法)。大对象是指尺寸大于-XX:PretenureSizeThreshold=<字节数>(注:-XX:PretenureSizeThreshold默认为0,表示任何对象都会先在新生代分配内存)*。

-Xms100m 表示初始堆区大小为100m
-Xmx100m 表示最大堆区大小为100m
-Xmn50m 表示最年轻代大小为50m(不设置的话默认为-Xmx的1/3)
-XX:NewRatio=n 表示老年代与年轻代的比例;例如n=3时,新生代:老年代 = 1:3(与-Xmn互斥使用,如果同时存在则以-Xmn为准)。
-XX:SurvivorRatio=n 新生代中 Eden与Survivor的比值,默认值为8

关于空间分配担保的场景

-XX:HandlePromotionFailure 空间分配担保参数,默认开启。
jd7以前(严格来讲是jdk6 update24以后):

java获取当前jvm地址 java获取jvm参数_开发语言_02


jd7以后:

只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC。

关于动态年龄判定的场景

新生代中年龄为x[1,-XX:MaxTenuringThreshold]的所有对象大小之和大于survivor区的一半,则所有年龄y>=x的对象都直接晋升至老年代,不再需要与-XX:MaxTenuringThreshold进行比较。

内存测试代码

@Test
public void test() {
    byte[] array = new byte[10 * 1024 * 1024];
    for (MemoryPoolMXBean memoryPoolMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
        System.out.println(memoryPoolMXBean.getName() + 
                "  总量:" + memoryPoolMXBean.getUsage().getCommitted() + 
                "  使用的内存:" + memoryPoolMXBean.getUsage().getUsed());
    }
}

查看初始参数:

-XX:+PrintFlagsInitial 打印出所有jvm初始化参数
-XX:+PrintFlagsInitial | grep MetaspaceSize 查看元空间相关参数
-XX:+HeapDumpOnOutOfMemoryError 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用