首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引导Java执行冗长的垃圾收集

引导Java执行冗长的垃圾收集
EN

Stack Overflow用户
提问于 2018-01-29 06:11:57
回答 5查看 820关注 0票数 1

我想向我的学生演示,在实时系统中使用Java可能会有问题,因为Java可能会进行意外的垃圾收集。如何编写Java程序,以便:

  1. 可能会导致Java在意想不到的时间内停止并执行垃圾收集(没有System.gc());
  2. 垃圾收集将花费明显的时间(例如几秒钟)?

如果这很重要,我在Ubuntu16.04上使用Open 8和Oracle JDK 8。

如果两者都做不到,那么我将对至少第2项感到满意,即在执行System.gc()时,垃圾收集需要很长时间的程序。

注意:我不是在寻找垃圾收集过程的图形表示--只是为了证明这需要很长时间。

EN

回答 5

Stack Overflow用户

发布于 2018-01-29 13:21:18

您可能需要查看“实时规范的Java”这里。您还可能希望阅读,这是关于在java上/在java中进行实时编程的介绍。

票数 1
EN

Stack Overflow用户

发布于 2018-01-29 13:45:42

您可以从一个相对较大的堆空间java -Xmx512m ...开始,以实现足够混乱的堆。

然后创建许多对象。具有圈的最佳图(具有长路径的循环引用)。让它们中的许多都过时。最好的多线程。

显示一些在垃圾收集上会停止的动画。最好在图和gc中显示步骤时间;Runtime.freeMemory()

使用jvm监视器。现在是在NetBeans或eclipse中引入内存& CPU分析的好时机。

票数 1
EN

Stack Overflow用户

发布于 2018-01-29 21:03:27

你有没有想过,如果你不能复制,你告诉你的学生的话通常是不真实的?如果您对实时的玩具定义是“暂停小于1s”,那么许多JVM应用程序都可以被认为是实时的。

这不需要求助于无用的收藏家。

当然,我们也可以轻松地构造GC需要超过1秒的情况,例如分配足够大的堆,以便系统开始交换。但在这种情况下,非GCed语言也会经历延迟高峰--也许没有那么糟糕--因此它将是GC问题的一个很差的演示。

System.gc()也是一个糟糕的演示,因为它当前调用一个单线程集合,而默认收集器的正常操作使用多个内核。修复工作正在进行中

要构建一个比较现实的场景,现代收集器将经历>1s暂停,您将需要

  • 一个大型堆-多个核通常可以相当快地咀嚼小堆。
  • 一个大的活集大小死的东西是便宜的。
  • 大量的小对象-大数组的原语通常被快速收集。
  • 许多对象之间的引用-空字段不需要更新。随机对象图也使G1GC的生活变得更加困难。

而且,由于您使用的是OpenJDK,所以您只需要测试针对桌面和服务器类工作负载的JVM收集器。还有其他JVM和第三方垃圾收集器实现的目标是实时的目标,所以你可以简单地拒绝你的演示,因为你不能用它赢得一场赛车场比赛,把下坡自行车称为一辆可怕的自行车。

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

https://stackoverflow.com/questions/48495327

复制
相关文章

相似问题

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