应用程序永远不会执行垃圾回收是否有任何条件?



应用程序永远不会执行垃圾回收时是否有任何条件?理论上是否有可能进行这样的应用程序设计?

是的,有。请阅读有关 Java 中的内存泄漏的信息。有效 Java 第 6 项:消除过时的对象引用中描述了一个示例

垃圾回收发生在应用程序中不再引用的对象上。

在 Java 11 中,有一种方法可以避免故意执行垃圾回收,方法是使用新引入的 Epsilon GC 运行 JVM,这是一种处理内存分配但从不释放分配内存的垃圾收集器。

市场上至少有一种产品使用 Java 和 jvm 技术实现高频交易。

显然,需要在微秒内做出反应的应用程序无法承受垃圾收集器在任意时间段内启动和停止系统。

在这种情况下,解决方案是编写整个应用程序,使其永远不会创建变成垃圾的对象。例如,所有输入数据都保存在固定字节数组中(在开始时分配一次(,然后用作各种处理的缓冲区。

除非我弄错了,否则您可以在软件工程广播播客上收听更多详细信息。我想应该是这一集:http://www.se-radio.net/2016/04/se-radio-episode-255-monica-beckwith-on-java-garbage-collection/

是否有任何条件应用程序永远不会执行垃圾回收?

您可以通过让线程未达到安全点来阻止 GC 运行。

除非您使用并发收集器,否则 GC 将仅在内存区域(例如,当 Eden 或 Tenure 空间填满时(执行。

如果这些设置足够大,并且垃圾率足够低,则 GC 将无法运行足够长的时间,因此您可以在维护时段内通宵执行 GC 或重新启动该过程。

理论上是否有可能进行这样的应用程序设计?

我处理过每天少于一次GC的应用程序(其中一些每天都会重新启动(

例如,假设您每秒产生 300KB 或每小时 1 GB 的垃圾,如果 Eden 大小为 24 GB,您可以在没有收集的情况下运行一整天。

实际上,如果您将大部分数据移出堆外,例如 Chronicle Map 或 Queue,您可能会发现一个 4 GB,可以运行一天甚至一周的次要集合。

相关内容

最新更新