首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >占用了太多的内存。

占用了太多的内存。
EN

Stack Overflow用户
提问于 2019-07-02 07:49:12
回答 2查看 2.2K关注 0票数 4

例如,我将-Xmx设置为40G。我希望我的java处理器不会使用超过40G。

我的程序在cms-gc上运行得很好。

但是,当我使用相同内存的G1 gc时(甚至增加15%的内存)。

它总是被奥姆杀手杀死。

我找到了一篇这样的文章:为什么我的Java进程比Xmx占用更多的内存?

它表示:

代码语言:javascript
复制
 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.

所以我想知道,如何限制g1 gc使用的内存,以及为什么g1使用这么多额外内存?

EN

回答 2

Stack Overflow用户

发布于 2019-07-02 08:11:32

您提到的那篇文章(为什么我的Java进程比Xmx占用更多的内存?)清楚地概述了它。

Java进程需要内存用于以下几个方面:

  • Java堆(也称为内存分配池)
  • 应用程序中每个线程的堆栈
  • JVM本身使用的内存(也称为permgen)
  • 按本机函数(JRE或第三方库)分配的内存

另一个问题是,某些JVM内存不算为permgen内存,无法控制。

因此,如果希望将Java应用程序限制在40 GB以内,则必须考虑所有类型的内存。从较小的值开始,例如:

代码语言:javascript
复制
-Xmx30g -XX:MaxPermSize=1g -Xss1m

然后观察进程的内存使用情况,如果进程安全地远离目标40 if,则增加Xmx

票数 1
EN

Stack Overflow用户

发布于 2020-05-21 23:50:23

您不能限制G1需要使用什么。如果可以的话--您会破坏所有的东西,或者在内存错误的堆中死掉,因为G1将没有资源来正常工作。要解释为什么这个算法需要使用额外的内存,并不简单。它至少需要为card tableremembered sets这就是为什么提供空间内存。它需要SATB队列的内存,当GC循环处于活动状态时,这些是“拦截”堆写入和读取的数据结构。我敢打赌还有更多。通常,如果您希望并发(以便您的应用程序在GC循环处于活动状态时运行),则需要提供更多的内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56847722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档