无gc io的垃圾收集Java
我想在关闭垃圾收集的情况下运行Java程序。在我自己的代码中管理内存并不是那么困难。 然而,该程序需要相当多的I/O。 是否有任何方法(除了对所有I/O操作使用JNI)可以使用纯Java实现这一点
谢谢 丹尼尔
你可以在下面搜索框中键入要查询的问题!
我想在关闭垃圾收集的情况下运行Java程序。在我自己的代码中管理内存并不是那么困难。 然而,该程序需要相当多的I/O。 是否有任何方法(除了对所有I/O操作使用JNI)可以使用纯Java实现这一点
谢谢 丹尼尔
# 1 楼答案
这并不难,这是不可能的。例如:
如果没有垃圾收集器的帮助
o
所消耗的内存如何被回收根据您的问题,我假设您可能希望避免由于应用程序执行的高级别I/O而导致的垃圾收集引起的零星暂停。在这种情况下,有一些技术可以最大限度地减少创建的对象数量(例如,重新使用池中的对象)。您也可以考虑启用Concurrent Mark Sweep Collector。
# 2 楼答案
您试图实现的目标通常是在投资银行开发低延迟实时系统
为了避免GC,您只需确保在应用程序的启动和预热阶段之后不分配内存。 正如您似乎已经注意到的那样,JavaNIO在内部执行不必要的内存分配。 不幸的是,您别无选择,只能为有问题的调用编写JNI替换。 您至少需要为NIO选择器编写一个替换项
由于类似的不需要的内存分配,您必须避免使用大多数Java库。 例如,您必须避免使用字符串等不可变对象,避免装箱,重新实现在程序的整个生命周期中预先分配足够条目的集合
以这种方式编写Java代码并不容易,但肯定是可能的。 我正在开发一个这样做的平台
# 3 楼答案
现代的JVM非常擅长处理短期对象,因此您自己设计的任何方案都会变慢
这是因为您自己处理的对象将变得长期存在,并从JVM获得额外的高级处理,例如移动等等。当然,这是由垃圾收集器完成的,您希望关闭垃圾收集器,但是如果没有任何gc,您可以做的很少
因此,在您开始考虑使用什么优化之前,先建立一个基线,在那里您有一个大型的未优化程序和概要文件它然后做一些调整,看看是否有帮助,但你永远不会知道你是否没有基线
# 4 楼答案
关闭垃圾收集的唯一方法是修改JVM。这在OpenJDK 6代码库中应该是可行的
然而,最终得到的是一个JVM,它疯狂地泄漏内存,没有修复泄漏的合理希望。Java类库API的设计和实现是基于一个GC负责内存管理的假设。这一点非常重要,任何认真尝试“修复”它的行为都会导致一种无法识别为Java的语言/库
如果你想要一个非垃圾收集语言,使用C或C++。p>
# 5 楼答案
GarbageCollection
是java中的自动内存管理。所以你不能禁用GC
# 6 楼答案
在JVM中禁用GC非常困难(但并非不可能)
查看JNI“关键”函数以获得提示
您还可以通过不分配任何更多的对象(编写一个JVMTI代理,如果您这样做了,它会打您一巴掌,并插入您的代码)来确保您不使用GC
最后,通过确保分配的每个对象永远不会被释放,您可以强制执行致命的OutOfMemoryError,因此当您点击-Xmx memory used时,您将失败,因为GC将无法回收任何东西(请注意,在堆中失败之前,您将在此时进行一次或多次GC)
真正的问题是你为什么要这么做?你认为这样做有什么好处?是实时的吗?如果是这样,我会考虑查看市场上可用的几种实时JVM(甲骨文、IBM和其他公司都出售)。老实说,我想不出还有什么理由在仍然使用Java的情况下这么做