当前位置: 首页 > 知识库问答 >
问题:

Java G1 gc占用太多内存

葛晔
2023-03-14

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

我的程序与cms gc配合得很好。

但当我使用相同的内存(甚至多15%的内存)切换到G1 gc时。

它总是被杀人凶手杀死。

我发现了这样一篇文章:为什么我的Java进程比Xmx消耗更多的内存?

它表示:

 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.

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

共有2个答案

谭刚毅
2023-03-14

你不能限制G1需要使用什么。如果可以的话——你可能会破坏一切,或者死于内存堆不足错误,因为G1没有资源来正常工作。解释这个算法为什么需要使用额外的内存并不简单。它至少需要内存来存储卡表记忆集,原因如下。它需要内存来存储SATB队列,这些是一些数据结构,当GC循环处于活动状态时,“拦截”堆写入和读取。我敢打赌还有更多。通常,如果您想要并发性(以便应用程序在GC循环处于活动状态时运行),则需要提供更多内存。

贲宜春
2023-03-14

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

Java进程需要内存来完成以下几件事:

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

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

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

-Xmx30g -XX:MaxPermSize=1g -Xss1m

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

 类似资料:
  • 我正在使用框架用iPhone摄像头捕捉视频,我的代码: 在之前,一切都很顺利,内存被限制在3M,但在之后,内存使用量每秒增加0.06M,几分钟后,应用程序会因为内存警告而崩溃。似乎占用了太多内存,并且可能存在内存泄漏问题。 那么如何减少内存使用量呢? iOS版本:7.1.1

  • 嗨,我对java编程还比较陌生。我编写的下面的程序似乎占用了很多内存(大约240 MB,正常吗?-我不这么认为!)请建议一些方法来优化这个程序,以便减少内存存储。 程序-- 代码-

  • 如何用QT3D画线?如何删除画好的线条?我发现下面的代码会占用太多的内存,如果你画很多线,尽管它可以工作。此方法只为绘制一条线分配了太多的存储空间,并且不会释放这些存储空间。如果你使用删除指针,那么它崩溃了。如何解决这个问题?

  • MySQLdump和上传过程花费了太长的时间(~8小时)来完成整个过程。 我正在将活动数据库转储到mysqldump.tar文件和几乎3GB。当我加载到新的数据库,它需要6-8小时来完成这个过程(上传到新的数据库)。 我要完成这个过程,推荐的解决方案是什么?

  • 我正在我的SQL中使用一个查询。首先我用 我该怎么做才能让它快过2秒