我现在运行的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压缩吗?我还在学习,所以如果这听起来很基础,请原谅。
4zcjmb1e1#
您可以使用JVM输出(通过-XX:+PrintFlagsFinal)来检查oop压缩
-XX:+PrintFlagsFinal
java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops bool UseCompressedOops := true {lp64_product}
对于大于32767m的堆,JVM禁用压缩的oops:
32767m
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添加到类路径中。
jdk/lib/sa-jdi.jar
1条答案
按热度按时间4zcjmb1e1#
您可以使用JVM输出(通过
-XX:+PrintFlagsFinal
)来检查oop压缩对于大于
32767m
的堆,JVM禁用压缩的oops:另一种选择是使用诊断vm选项:
它返回有关oops模式的详细信息:
最先进的方法是使用HotSpot Serviceability Agent,它允许检查有关JVM内部的更多信息:
您可以使用堆大小参数并检查输出。SA的Java类放在
jdk/lib/sa-jdi.jar
中,因此您必须将此jar添加到类路径中。