java 我能发现普通对象指针在我当前的JDK中是否被压缩了吗

e0bqpujr  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(107)

我现在运行的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压缩吗?我还在学习,所以如果这听起来很基础,请原谅。

4zcjmb1e

4zcjmb1e1#

您可以使用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}

另一种选择是使用诊断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

最先进的方法是使用HotSpot Serviceability Agent,它允许检查有关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添加到类路径中。

相关问题