我目前正在运行以下版本的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压缩?我还在学习,所以请原谅这听起来很基本。
答案 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添加到类路径中。