【问题标题】:Is there a way to determine the size taken by OOPS in a jvm process有没有办法确定 OOPS 在 jvm 进程中占用的大小
【发布时间】:2015-12-24 07:23:55
【问题描述】:

我正在调整在 64 位环境中运行的堆重 Java 应用程序(所需的堆大小超过 32G),并打算将 Xmx 增加到适当的数字。

在 32G 之后,OOP(普通对象指针)将不会使用 -XX:+UseCompressedOops 选项进行压缩。所以需要知道我的应用程序中 OOP 的确切大小,以补偿未压缩的 OOPS 并增加额外的内存。

有没有办法单独确定 OOP 消耗的总内存?

【问题讨论】:

  • 普通对象指针
  • 似乎是 stackoverflow.com/questions/52353/… 的副本 您是否尝试过使用 Profiler?如果是,你能分享一下结果吗?
  • 它不是重复的,这里我不是试图单独理解 OOP 所占用的大小,而不是对象。
  • 您可能想查看 JOL - openjdk.java.net/projects/code-tools/jol
  • 如果您已经消耗了超过 32gb 的数据,那么减少几兆字节真的不会动摇船。

标签: java performance jvm


【解决方案1】:

使用 Java Object Layout 库非常简单,它是 Maven Central 上的 available。只需检查org.openjdk.jol.util.VMSupport.OOP_SIZE 静态字段:

import org.openjdk.jol.util.VMSupport;

public class Test {
    public static void main(String[] args) {
        // Prints OOP size in bytes: usually 4 or 8
        System.out.println(VMSupport.OOP_SIZE);
    }
}

样本输出:

$ java -cp jol-core-0.4.jar;bin -Xmx32G Test
8

$ java -cp jol-core-0.4.jar;bin -Xmx31G Test
4

$ java -cp jol-core-0.4.jar;bin -Xmx32G -XX:-UseCompressedOops Test
8

【讨论】:

  • 这将告诉我一个 OOP 的大小,这不是我想要的。我想知道进程中所有 OOP 消耗的大小
  • @Vivek 这样做的唯一方法是转储堆中的所有对象并计算引用的数量。你为什么想知道这个?也许有更好的方法来做到这一点?您是否尝试过使用内存分析器?
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2021-09-24
  • 2019-08-20
  • 2019-12-17
  • 2020-12-05
  • 2015-06-15
相关资源
最近更新 更多