Java没有gc - io

Dan*_*Dan 1 java io garbage-collection

我想运行一个关闭垃圾收集的Java程序.在我自己的代码中管理内存并不是那么困难.但是该程序需要相当多的I/O. 有没有办法(没有使用JNI进行所有I/O操作)我可以使用纯Java实现这一点?

谢谢Daniel

Ada*_*ski 8

在我自己的代码中管理内存并不是那么困难.

这并不困难 - 这是不可能的.例如:

public void foo() {
  Object o = new Object();

  // free(o); // Doh! No "free" keyword in Java.
}
Run Code Online (Sandbox Code Playgroud)

没有垃圾收集器的帮助,如何o回收消耗的内存?

我假设你的问题是你可能想要避免由于你的应用程序执行高水平的I/O而导致的垃圾收集造成的零星暂停.如果是这种情况,则存在用于最小化创建的对象的数量的技术(例如,重用池中的对象).您还可以考虑启用Concurrent Mark Sweep Collector.

并发标记清除收集器(也称为并发收集器或CMS)针对对垃圾收集暂停敏感的应用程序.

  • @Dan,你只需要使用不同的语言.听起来像C或C++这里是明显的选择,尽管你可能在.NET中使用非托管代码破解了足够的解决方案.使用现代JVM,您可以最大限度地减少"程序停止响应"的情况,但您无法消除它 - 并且您不能使用GC. (2认同)

小智 8

您尝试实现的目标通常是在投资银行业务中开发,以开发低延迟的实时系统.

要避免GC,您只需确保在应用程序的启动和预热阶段后不分配内存.您似乎已经注意到Java NIO在内部进行了不必要的内存分配.不幸的是,你别无选择,只能为有问题的电话编写JNI替代品.您至少需要为NIO选择器编写替代品.

由于类似的不需要的内存分配,您将不得不避免使用大多数Java库.例如,您将不得不避免使用像String这样的不可变对象,避免使用Boxing,重新实现在程序的整个生命周期中预分配足够条目的集合.

以这种方式编写Java代码并不容易,但肯定是可能的.我正在开发一个平台来做到这一点.