我可以找出普通对象指针是否在我当前的jdk中压缩

时间:2018-04-10 03:46:10

标签: java jvm

我目前正在运行以下版本的jdk:

openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

有没有办法验证此jdk是否支持oop压缩?我还在学习,所以请原谅这听起来很基本。

1 个答案:

答案 0 :(得分:1)

您可以使用JVM输出(通过-XX:+PrintFlagsFinal)来检查oop压缩

java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
     bool UseCompressedOops                        := true                                {lp64_product} 

对于大于32767m的堆,JVM禁用压缩的oops:

java -Xmx32767m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
     bool UseCompressedOops                         = false                               {lp64_product}

另一个选择是使用diagostic vm选项:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

返回有关oops模式的详细信息:

heap address: 0x0000000082600000, size: 2010 MB, Compressed Oops mode: 32-bit
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x0000000100000000 Req Addr: 0x0000000100000000

最先进的方法是使用assertions,它可以检查有关JVM内部的更多信息:

import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;

public class OopsChecker extends Tool {

    @Override
    public void run() {
        VM vm = VM.getVM();
        System.out.println("CompressedOops = " + vm.isCompressedOopsEnabled());
        System.out.println("CompressedClassPointers = " + vm.isCompressedKlassPointersEnabled());
        System.out.println("OOP base = 0x" + Long.toHexString(vm.getDebugger().getNarrowOopBase()));
        System.out.println("OOP shift = " + vm.getDebugger().getNarrowOopShift());
    }

    public static void main(String[] args) {
        new OopsChecker().execute(args);
    }
}

您可以使用堆大小参数并检查输出。 SA的Java类放在jdk/lib/sa-jdi.jar中,因此您必须将此jar添加到类路径中。