Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么当我增加新时代记忆时,小GC时间会增加_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 为什么当我增加新时代记忆时,小GC时间会增加

Java 为什么当我增加新时代记忆时,小GC时间会增加,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我以前使用2G新时代内存,我看到每10秒发生一次次要gc,每次需要0.1-0.15秒,我想减少次要gc频率,所以我将新时代内存设置为3G。在这之后,每15秒会发生一次小gc,但是需要大约0.3秒才能完成。为什么当我增加新时代记忆时,小GC时间会增加?我注意到在我增加内存后,GC后的活动对象从55M增加到80M,原因是什么?原因是,在较大的内存区域中有更多的活动对象。GC时间主要根据必须复制到幸存者区域的活动对象的数量(和总大小)进行缩放 只有创建多个对象同时存在且不完全适合YG,才能从更大的年轻

我以前使用2G新时代内存,我看到每10秒发生一次次要gc,每次需要0.1-0.15秒,我想减少次要gc频率,所以我将新时代内存设置为3G。在这之后,每15秒会发生一次小gc,但是需要大约0.3秒才能完成。为什么当我增加新时代记忆时,小GC时间会增加?我注意到在我增加内存后,GC后的活动对象从55M增加到80M,原因是什么?

原因是,在较大的内存区域中有更多的活动对象。GC时间主要根据必须复制到幸存者区域的活动对象的数量(和总大小)进行缩放

只有创建多个对象同时存在且不完全适合YG,才能从更大的年轻一代区域中获益。这就迫使他们成为老一代的终身教职人员


否则总GC时间保持不变,您只需选择如何将其拆分为单个停止世界事件:更长和更少的事件,或更短和更频繁的事件。

原因是,较大内存区域中有更多活动对象。GC时间主要根据必须复制到幸存者区域的活动对象的数量(和总大小)进行缩放

只有创建多个对象同时存在且不完全适合YG,才能从更大的年轻一代区域中获益。这就迫使他们成为老一代的终身教职人员


否则,总GC时间保持不变,您只需选择如何将其拆分为单个停止世界事件:更长和更少的事件,或更短和更频繁的事件。

如果您想增加年轻集合之间的时间间隔,您需要增加Eden大小。当你改变年轻一代的大小时,你很可能也改变了两件事,幸存者空间的大小和寿命阈值。在提升到永久空间之前,对象在幸存者空间之间来回复制的次数由永久性保留决定。默认的使用期限阈值为4,但某些参数(如
-Xmn
)会将使用期限阈值更改为15,除非您也指定了它

您可以通过设置
-XX:SurvivorRatio=8
表单示例来增加Eden空间,并将保留时间限制为
-XX:MaxTenuringThreshold=4
限制保留时间阈值的缺点是将更多对象提升到保留时间空间,这会对您的完整GC造成压力


在尝试保留GC之前,我始终建议您查看内存配置文件,例如使用飞行记录器。我经常发现,您可以将垃圾率降低2-4倍,这将使调整应用程序变得更加容易。

如果您想增加年轻收集之间的时间间隔,您需要增加Eden大小。当你改变年轻一代的大小时,你很可能也改变了两件事,幸存者空间的大小和寿命阈值。在提升到永久空间之前,对象在幸存者空间之间来回复制的次数由永久性保留决定。默认的使用期限阈值为4,但某些参数(如
-Xmn
)会将使用期限阈值更改为15,除非您也指定了它

您可以通过设置
-XX:SurvivorRatio=8
表单示例来增加Eden空间,并将保留时间限制为
-XX:MaxTenuringThreshold=4
限制保留时间阈值的缺点是将更多对象提升到保留时间空间,这会对您的完整GC造成压力


在尝试保留GC之前,我始终建议您查看内存配置文件,例如使用飞行记录器。我经常发现,您可以将垃圾率降低2-4倍,这将使调整应用程序变得更加容易。

我的应用程序逻辑非常简单,它只接收请求,转换接收到的数据,然后发送到另一台服务器。所以我认为活动对象取决于处理了多少请求,因为请求完成后,所有对象都被释放。如果每秒的请求数相同,为什么活动对象会随着内存区域的增加而增加?除了您之外,几乎没有人能发现这一点。正如我所描述的,也许有更少的保留期?我在gc日志中打印保留期细节,无论在我更改YG内存之前还是之后,OG中几乎没有保留期。实际上,几乎所有对象都是在0或1岁时收集的。不同之处在于2G YG,1岁物体约55米,3G YG,1岁物体约80米。@Xilang如果活动物体增加,则意味着保留的物体比你想象的要多。中等寿命的对象确实很昂贵,因此识别和减少它们可以带来很大的不同。尝试在次要gc之前获取jmap历史记录。如果需要足够慢的话,将Eden增加到24GB。我的应用程序逻辑非常简单,它只接收请求,转换接收到的数据,然后发送到另一台服务器。所以我认为活动对象取决于处理了多少请求,因为请求完成后,所有对象都被释放。如果每秒的请求数相同,为什么活动对象会随着内存区域的增加而增加?除了您之外,几乎没有人能发现这一点。正如我所描述的,也许有更少的保留期?我在gc日志中打印保留期细节,无论在我更改YG内存之前还是之后,OG中几乎没有保留期。实际上,几乎所有对象都是在0或1岁时收集的。不同之处在于2G YG,1岁物体约55米,3G YG,1岁物体约80米。@Xilang如果活动物体增加,则意味着保留的物体比你想象的要多。中等寿命的对象确实很昂贵,因此识别和减少它们可以带来很大的不同。尝试在次要gc之前获取jmap历史记录。如果需要足够慢的话,可以将Eden增加到24GB