gpt4 book ai didi

garbage-collection - Java中的总内存是如何计算的

转载 作者:行者123 更新时间:2023-12-04 07:53:57 28 4
gpt4 key购买 nike

如果我有 8GB RAM 并且我在 64 位 JVM 上使用以下内容

  • 最大堆大小 6144MB
  • 最大 perm gen 空间 2048MB
  • 堆栈大小 2MB

Q1 : perm gen空间是从max heap分配的还是单独分配的?

Q2:如果分开,那么具有上述设置的 jvm 是否会启动,或者它会给出错误,因为堆 + permgen + 堆栈 + 程序数据将超过总 RAM?

最佳答案

首先请记住,您使用 -Xmx 设置的参数(因为我想这就是您设置堆大小的方式)是您的 Java 代码可用的堆大小,而不是数量JVM 将消耗的内存。不同之处在于 JVM 保留的内务管理结构(垃圾收集器结构、JIT 开销等),有时是 native 代码分配的内存、缓冲区等。这个额外内存的大小取决于 JVM 版本、您正在运行的应用程序和其他因素,但我已经看到 JVM 分配的 RAM 是应用程序可见的堆大小的两倍。对于一般情况,我通常认为 50% 是一个安全裕度,20-30% 是可以接受的。如果您将堆大小设置为接近机器中的 RAM 数量,您将遇到交换并且性能会受到影响。

现在列举问题:

Perm gen 至少在 Oracle 的 JDK 6 中是一个独立于堆的空间。它是独立的,因为它经历了与常规堆完全不同的内存管理规则。顺便说一句,2 GB 的 pergen 空间很大 - 你确定你真的需要它吗?

关于第二个问题,见上文。如果这是 Oracle 的 JDK,您可能会遇到麻烦,因为 perm 和堆相加,但会有额外的内存,通常约为 6 GB 堆的 20-50%,加上堆和 perm 空间,这将不仅仅是你的内存。起初尝试此设置可能有效,但一旦堆和 perm gen 空间使用率都接近其配置的限制,您可能会耗尽内存。

关于garbage-collection - Java中的总内存是如何计算的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15393933/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com