我想向我的学生演示,在实时系统中使用Java可能会有问题,因为Java可能会进行意外的垃圾收集。如何编写Java程序,以便:
如果这很重要,我在Ubuntu16.04上使用Open 8和Oracle JDK 8。
如果两者都做不到,那么我将对至少第2项感到满意,即在执行System.gc()时,垃圾收集需要很长时间的程序。
注意:我不是在寻找垃圾收集过程的图形表示--只是为了证明这需要很长时间。
发布于 2018-01-29 13:21:18
您可能需要查看“实时规范的Java”这里。您还可能希望阅读这,这是关于在java上/在java中进行实时编程的介绍。
发布于 2018-01-29 13:45:42
您可以从一个相对较大的堆空间java -Xmx512m ...开始,以实现足够混乱的堆。
然后创建许多对象。具有圈的最佳图(具有长路径的循环引用)。让它们中的许多都过时。最好的多线程。
显示一些在垃圾收集上会停止的动画。最好在图和gc中显示步骤时间;Runtime.freeMemory()。
使用jvm监视器。现在是在NetBeans或eclipse中引入内存& CPU分析的好时机。
发布于 2018-01-29 21:03:27
你有没有想过,如果你不能复制,你告诉你的学生的话通常是不真实的?如果您对实时的玩具定义是“暂停小于1s”,那么许多JVM应用程序都可以被认为是实时的。
这不需要求助于无用的收藏家。
当然,我们也可以轻松地构造GC需要超过1秒的情况,例如分配足够大的堆,以便系统开始交换。但在这种情况下,非GCed语言也会经历延迟高峰--也许没有那么糟糕--因此它将是GC问题的一个很差的演示。
System.gc()也是一个糟糕的演示,因为它当前调用一个单线程集合,而默认收集器的正常操作使用多个内核。修复工作正在进行中
要构建一个比较现实的场景,现代收集器将经历>1s暂停,您将需要
而且,由于您使用的是OpenJDK,所以您只需要测试针对桌面和服务器类工作负载的JVM收集器。还有其他JVM和第三方垃圾收集器实现的目标是实时的目标,所以你可以简单地拒绝你的演示,因为你不能用它赢得一场赛车场比赛,把下坡自行车称为一辆可怕的自行车。
https://stackoverflow.com/questions/48495327
复制相似问题