java8 -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16

2023-11-25

所以,我试图运行一些简单的代码,jdk-8,通过 jol 输出

    System.out.println(VMSupport.vmDetails());
    Integer i = new Integer(23);
    System.out.println(ClassLayout.parseInstance(i)
            .toPrintable());

第一次尝试是在禁用压缩 oops 和压缩 klass 的情况下在 64 位 JVM 上运行它。

-XX:-UseCompressedOops -XX:-UseCompressedClassPointers

几乎预期的输出是:

Running 64-bit HotSpot VM.
Objects are 8 bytes aligned.

java.lang.Integer object internals:
OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
  0     4       (object header)                01 00 00 00 (00000001 00000000 00000000 00000000) (1)
  4     4       (object header)                00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4       (object header)                48 33 36 97 (01001000 00110011 00110110 10010111) (-1758055608)
 12     4       (object header)                01 00 00 00 (00000001 00000000 00000000 00000000) (1)
 16     4   int Integer.value                  23
 20     4       (loss due to the next object alignment)

Instance size: 24 bytes (reported by Instrumentation API)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

这是有道理的:8 字节 klass 字 + 8 字节标记字 + 4 字节实际值和 4 字节填充(与 8 字节对齐)= 24 字节。

第二次尝试在 64 位 JVM 上使用启用了压缩 oops 的压缩 klass 来运行它。

同样,输出是很容易理解的:

Running 64-bit HotSpot VM.
Using compressed oop with 3-bit shift.
Using compressed klass with 3-bit shift.
Objects are 8 bytes aligned.

OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
  0     4       (object header)                01 00 00 00 (00000001 00000000 00000000 00000000) (1)
  4     4       (object header)                00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4       (object header)                f9 33 01 f8 (11111001 00110011 00000001 11111000) (-134138887)
 12     4   int Dummy.i                        42
 Instance size: 16 bytes (reported by Instrumentation API).

4 字节压缩 oop(klass 字)+ 8 字节标记字 + 4 字节值 + 无空间损失 = 16 字节。

对我来说没有意义的是这个用例:

 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:ObjectAlignmentInBytes=16

输出是这样的:

 Running 64-bit HotSpot VM.
 Using compressed oop with 4-bit shift.
 Using compressed klass with 0x0000001000000000 base address and 0-bit shift.

我真的很期待两者都是“4 位移位”。为什么他们不是?

EDIT第二个示例的运行方式为:

 XX:+UseCompressedOops -XX:+UseCompressedClassPointers

第三个是:

 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:ObjectAlignmentInBytes=16

在研究 OpenJDK 代码时,这些问题的答案很容易找到。

例如,grep 表示“UseCompressedClassPointers”,这将使您参数.cpp:

// Check the CompressedClassSpaceSize to make sure we use compressed klass ptrs.
if (UseCompressedClassPointers) {
  if (CompressedClassSpaceSize > KlassEncodingMetaspaceMax) {
    warning("CompressedClassSpaceSize is too large for UseCompressedClassPointers");
    FLAG_SET_DEFAULT(UseCompressedClassPointers, false);
  }
}

好吧,有趣的是,有“CompressedClassSpaceSize”? Grep 的定义是全局变量.hpp:

  product(size_t, CompressedClassSpaceSize, 1*G,                            \
          "Maximum size of class area in Metaspace when compressed "        \
          "class pointers are used")                                        \
          range(1*M, 3*G)                                                   \

啊哈,所以类区域位于元空间中,它占用 1 Mb 到 3 Gb 的空间。让我们 grep 查找“CompressedClassSpaceSize”用法,因为这将带我们到处理它的实际代码,例如元空间.cpp:

// For UseCompressedClassPointers the class space is reserved above
// the top of the Java heap. The argument passed in is at the base of
// the compressed space.
void Metaspace::initialize_class_space(ReservedSpace rs) {

因此,压缩类被分配在 Java 堆之外更小的类空间中,这不需要移位——即使 3 GB 也足够小,只需要使用最低的 32 位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8 -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 的相关文章

随机推荐

  • 协作编辑 LaTeX 文档的技巧 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我的默认设置是将 tex 源放入 subversion 存储库中 并在更改其他人的内容时将注释作为源中的注释相互插入 这一切都感觉不太理想 尤其是当存在颠覆冲突时 它告诉你的只是
  • 除非使用 Leiningen REPL,否则 Clojure jdbc create-table 语句不会运行

    我有一个小型 Clojure 程序 它使用Clojure JDBC在 HSQL 数据库中创建表的工具 然而 如果我从 Leiningen 的 REPL 运行它 它似乎只会实际创建该表 如果我使用运行代码 它不会创建表lein run或从我的
  • Java + Eclipse:同步 stdout 和 stderr

    我使用Eclipse 当我有这样的应用程序时 write 20 times Hello World n to stdout write ERROR n to stderr write 5 times Hello World n to std
  • 如何配置Spring-Boot应用程序以继续使用RestEasy?

    我有一个旧的 Web 应用程序 纯 servlet 没有 Spring 我想将其作为 fat jar 运行 这个应用程序提供了很多REST服务 我不想修改旧代码 如何配置Spring Boot应用程序以继续使用RestEasy 您可以使用
  • 在 Tapestry 5 中更新表单内的区域

    我有一个Zone里面一个Form the Zone已更新为包含我想绑定到父级的输入字段的块Form 不幸的是 这似乎并不像我希望的那么容易 因为我收到了以下错误消息 The Description component must be enc
  • FireFox 位于“从...传输数据”或“读取...”

    我正在使用 Selenium 为网站构建一些功能测试 但我遇到了一个奇怪的浏览器问题 页面似乎永远无法完成加载 状态栏显示 正在从 传输数据 或 读取 由于页面永远不会完成加载 我的硒测试超时 该问题似乎只发生在 FireFox 上 我们的
  • cv2.connectedComponents 未检测到组件

    我使用的是 Ubuntu python 2 7 使用 OpenCV 我试图准确理解函数 cv2 connectedComponents 正在做什么 这是图像 代码 import cv2 import numpy as np img cv2
  • 在 Django 中动态删除内联表单集

    是否可以让 Django 自动删除请求中不存在的表单集 例如 如果在加载编辑页面时我有三个以 HTML 表示的内联表单集 并且在处理请求时使用 javascript 删除其中两个表单集 则 Django 会发现这两个表单不再是它们的 并将它
  • Angular 6 / NGRX 联合减速机

    我正在使用 Angular 6 w NgRX 4 我有多个想要组合的减速器 应用程序模块 ts import BrowserModule from angular platform browser import NgModule from
  • 如果父级有 ng-if,Angular ng-show 不起作用

    我有一个视图 其中父 div 上有 ng if 而某些子元素上有 ng show 当嵌套在带有 ng if 的元素下时 ng show 似乎无法正常工作 这是 Angular 的错误还是我做错了什么 看看这个笨蛋 HTML div div
  • 使 Java 属性跨类可用?

    我选择使用属性文件来自定义某些设置 我使用以下代码使属性对象在类中可用 Properties defaultProps new Properties try FileInputStream in new FileInputStream cu
  • 如果使用 jQuery 文本为“0”,如何隐藏“span”?

    我正在寻找隐藏包含 0 的跨度 我查看了其他代码并尝试对其进行调整 但无法使其正常工作 我希望它仅在内容为 0 时隐藏跨度 但是当运行下面的代码时 它也会隐藏任何包含 0 的数字 例如 10 这是我不想要的 为了更清楚一点 跨度只应在其内部
  • 在不相关的文件中“无法重新声明块范围变量”

    有一个简单的 TS 包用作 CommonJS 模块并且没有导出 TS文件被编译为同名的JS文件并用作require package option foo tsconfig json compilerOptions target es5 选项
  • 如何通过 Javascript 将图像添加到按钮?

    我正在尝试使用 Javascript 将图像添加到按钮 但我似乎无法让它工作 我已经使用 HTML5 成功添加了图像 但是 根据我的需要 我需要通过 javascript 添加图像 以下是我编写的通过 HTML 添加图像的内容
  • Javascript 可以帮我按 Enter 键吗?

    有一个网站 我想在我离开时继续按 Enter 键 是否可以做类似的事情 setInterval function have javascript press the button with a certain id 100 我想把它放在智能
  • light gbm - python API 与 Scikit-learn API

    我正在尝试应用 LightGBM 并已经完成了 Python API文档 Training API 和 Scikit learn API 有什么区别吗 我们可以使用这两个 API 来针对同一问题获得相同的结果吗 简短的回答 是的 如果您以相
  • 如何在 tomcat 中从 Filter 类方法响应 servlet 客户端时设置 http 状态代码

    我正在用 spring 编写一个 web 服务 这个问题与 spring 无关 它实现了一个 希望 restful api 据我了解 所有响应都应采用 xml 或 json 格式 在大多数情况下 这并不是什么大问题 但在一种情况下这似乎是不
  • 如何有条件地选择numpy数组中的元素

    有人可以帮助我有条件地选择 numpy 数组中的元素吗 我正在尝试返回大于阈值的元素 我目前的解决方案是 sampleArr np array 0 725 0 39 0 99 condition sampleArr gt 0 5 extra
  • 使用 openssl verify 验证证书链

    我正在使用以下组件构建自己的证书链 Root Certificate Intermediate Certificate User Certificate 根证书是自签名证书 中间证书由根证书和中间证书由用户签名 现在我想验证用户证书是否具有
  • java8 -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16

    所以 我试图运行一些简单的代码 jdk 8 通过 jol 输出 System out println VMSupport vmDetails Integer i new Integer 23 System out println Class