应用程序将永远不会执行垃圾收集时有什么条件?

时间:2018-09-30 10:28:54

标签: java garbage-collection jvm

应用程序永远不会执行垃圾回收吗?从理论上讲,可以进行这种应用程序设计吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

很显然,需要微秒级响应的应用程序无法让垃圾收集器在任意时间段内启动并暂停系统。

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

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

答案 3 :(得分:0)

  

应用程序永远不会执行垃圾回收吗?

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

除非您使用并发收集器,否则GC仅在内存区域(例如内存区域)时执行。伊甸园或终身制职位填补时。

如果将它们做得足够大,而垃圾回收率又足够低,则GC将无法运行太长时间,因此您无法在一夜之间在维护窗口中执行GC或重新启动该过程。

  

理论上可以进行这种应用程序设计吗?

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

例如,假设您每秒产生300KB的垃圾,或每小时产生1 GB的垃圾,而Eden大小为24 GB,您可以整天运行而无需收集垃圾。

实际上,如果您将大部分数据移到堆外,例如根据Chronicle Map或Queue,您可能会发现有4 GB的空间,可以运行一天甚至一周的时间,而且收集的内容很少。