没有gc-io的Java

没有gc-io的Java,java,garbage-collection,io,Java,Garbage Collection,Io,我想在关闭垃圾收集的情况下运行Java程序。在我自己的代码中管理内存并不是那么困难。 然而,该程序需要相当多的I/O。 对于我可以使用纯Java实现的所有I/O操作,除了使用JNI之外还有其他方法吗 谢谢 DanielGarbageCollection是java中的自动内存管理。因此,您不能禁用GCGarbageCollection是java中的自动内存管理。因此,您不能禁用GC 在我自己的代码中管理内存不是一件容易的事 太难了 这并不难——这是不可能的。例如: public void foo(

我想在关闭垃圾收集的情况下运行Java程序。在我自己的代码中管理内存并不是那么困难。 然而,该程序需要相当多的I/O。 对于我可以使用纯Java实现的所有I/O操作,除了使用JNI之外还有其他方法吗

谢谢 Daniel

GarbageCollection是java中的自动内存管理。因此,您不能禁用GC

GarbageCollection是java中的自动内存管理。因此,您不能禁用GC

在我自己的代码中管理内存不是一件容易的事 太难了

这并不难——这是不可能的。例如:

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

  // free(o); // Doh! No "free" keyword in Java.
}
没有垃圾收集器的帮助,o消耗的内存如何被回收

根据您的问题,我假设您可能希望避免由于应用程序执行的高级别I/O而导致的垃圾收集引起的零星暂停。在这种情况下,有一些技术可以最大限度地减少创建的对象数量,例如重新使用池中的对象。您也可以考虑启用.< /P> 并发标记扫描收集器, 也称为并发收集器 或CMS,是针对应用程序的 对垃圾很敏感的 收集暂停

在我自己的代码中管理内存不是一件容易的事 太难了

这并不难——这是不可能的。例如:

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

  // free(o); // Doh! No "free" keyword in Java.
}
没有垃圾收集器的帮助,o消耗的内存如何被回收

根据您的问题,我假设您可能希望避免由于应用程序执行的高级别I/O而导致的垃圾收集引起的零星暂停。在这种情况下,有一些技术可以最大限度地减少创建的对象数量,例如重新使用池中的对象。您也可以考虑启用.< /P> 并发标记扫描收集器, 也称为并发收集器 或CMS,是针对应用程序的 对垃圾很敏感的 收集暂停


关闭垃圾收集的唯一方法是修改JVM。这在OpenJDK 6代码库中应该是可行的

然而,最终得到的是一个JVM,它疯狂地泄漏内存,没有修复泄漏的合理希望。Java类库API的设计和实现是基于一个GC负责内存管理的假设。这是非常基本的,任何认真的尝试修复它都会导致一种无法识别为Java的语言/库


如果你想要一个非垃圾收集语言,使用C或C++。

你能关闭垃圾收集的唯一方法是修改JVM。这在OpenJDK 6代码库中应该是可行的

然而,最终得到的是一个JVM,它疯狂地泄漏内存,没有修复泄漏的合理希望。Java类库API的设计和实现是基于一个GC负责内存管理的假设。这是非常基本的,任何认真的尝试修复它都会导致一种无法识别为Java的语言/库


如果你想要一个非垃圾收集语言,使用C或C++。

< P>现代JVM是如此擅长处理短时间的对象,任何你自己设计的方案都会比较慢。 这是因为您自己处理的对象将变得长期存在,并从JVM获得额外的高级处理,例如移动等等。当然,这是由垃圾收集器完成的,您希望关闭垃圾收集器,但是如果没有任何gc,您可以做的很少


所以,在您开始考虑使用什么优化之前,先建立一个基线,在那里您有一个大型的未优化程序,并对其进行分析。然后进行调整,看看是否有帮助,但如果没有基线,你永远不会知道

现代JVM非常擅长处理短期对象,因此您自己设计的任何方案都会比较慢

这是因为您自己处理的对象将变得长期存在,并从JVM获得额外的高级处理,例如移动等等。当然,这是由垃圾收集器完成的,您希望关闭垃圾收集器,但是如果没有任何gc,您可以做的很少


所以,在您开始考虑使用什么优化之前,先建立一个基线,在那里您有一个大型的未优化程序,并对其进行分析。然后进行调整,看看是否有帮助,但如果没有基线,你永远不会知道

在JVM中禁用GC非常困难,但并非不可能

查看JNI关键函数以获得提示

您还可以通过不分配任何更多的对象来确保不使用GC,编写一个JVMTI代理,如果您这样做了,它会打您一巴掌,并插入您的代码

最后,通过确保分配的每个对象永远不会被释放,您可以强制执行致命的OutOfMemoryError,因此当您点击-Xmx memory used时,您将摔倒,因为GC将无法回收任何内容。请注意,您将同时GC一次或多次 在你摔成一堆之前,请记住这一点


真正的问题是你为什么要这么做?你认为这样做有什么好处?是实时的吗?如果是这样的话,我会考虑看看市场上可用的几种实时JVM之一,Oracle、IBM和其他公司都会出售它们。老实说,我想不出还有什么理由在仍然使用Java的情况下这么做。

在JVM中禁用GC非常困难,但并非不可能

查看JNI关键函数以获得提示

您还可以通过不分配任何更多的对象来确保不使用GC,编写一个JVMTI代理,如果您这样做了,它会打您一巴掌,并插入您的代码

最后,通过确保分配的每个对象永远不会被释放,您可以强制执行致命的OutOfMemoryError,因此当您点击-Xmx memory used时,您将失败,因为GC将无法回收任何内容。请注意,此时您将在堆中失败之前进行一次或多次GC


真正的问题是你为什么要这么做?你认为这样做有什么好处?是实时的吗?如果是这样的话,我会考虑看看市场上可用的几种实时JVM之一,Oracle、IBM和其他公司都会出售它们。老实说,我想不出还有什么理由在仍然使用Java的情况下这么做。

既然你说的都是关于可预测性而不是直线速度,那么你应该考虑使用具有确定性垃圾收集的系统。

既然你说的都是关于可预测性而不是直线速度,您应该考虑使用具有确定性垃圾收集的系统。

您试图实现的目标通常是在投资银行开发低延迟实时系统

为了避免GC,您只需确保在应用程序的启动和预热阶段之后不分配内存。 正如您似乎已经注意到的那样,JavaNIO在内部执行不必要的内存分配。 不幸的是,您别无选择,只能为有问题的调用编写JNI替换。 您至少需要为NIO选择器编写一个替换项

由于类似的不需要的内存分配,您必须避免使用大多数Java库。 例如,您必须避免使用字符串等不可变对象,避免装箱,重新实现在程序的整个生命周期中预先分配足够条目的集合

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

您试图实现的目标通常是在投资银行开发低延迟实时系统

为了避免GC,您只需确保在应用程序的启动和预热阶段之后不分配内存。 正如您似乎已经注意到的那样,JavaNIO在内部执行不必要的内存分配。 不幸的是,您别无选择,只能为有问题的调用编写JNI替换。 您至少需要为NIO选择器编写一个替换项

由于类似的不需要的内存分配,您必须避免使用大多数Java库。 例如,您必须避免使用字符串等不可变对象,避免装箱,重新实现在程序的整个生命周期中预先分配足够条目的集合

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

您不能禁用垃圾收集器。除非你是说别的什么?如果你想管理自己的内存,请为你的应用程序使用不同的语言和平台。如果可以禁用GC,那么我可以使用自己的缓存在Java中实现。为什么不能通过某种标志来禁用GC?@Dan,Java无法释放内存,不管是使用自己的缓存还是其他方式。如果您禁用了GC,那么内存占用可能会惊人地快速增长,JVM会很快崩溃。@Dan:如果您确实需要可预测的实时行为,您应该看看Java RTS:。虽然我不能100%确定您是否真的知道自己想要什么,但是使用标准Java VM您将无法达到您想要的目的。您不能禁用垃圾收集器。除非你是说别的什么?如果你想管理自己的内存,请为你的应用程序使用不同的语言和平台。如果可以禁用GC,那么我可以使用自己的缓存在Java中实现。为什么不能通过某种标志来禁用GC?@Dan,Java无法释放内存,不管是使用自己的缓存还是其他方式。如果您禁用了GC,那么内存占用可能会惊人地快速增长,JVM会很快崩溃。@Dan:如果您确实需要可预测的实时行为,您应该看看Java RTS:。虽然我不能100%确定您是否真的知道您想要什么,但使用标准Java VM您将无法达到您想要的目的。不,我将始终使用缓存来重用对象。对于您看不到或控制不到的临时对象呢?在各种各样的库中,有很多东西是不知道你的记忆模式的。也许是这样,但库中的
您将用于I/O的y代码可能正在某处创建对象。还有,你有没有确定这是个问题?为了速度而避免对象创建在我看来是一种代码味道。大多数情况下,你的应用程序都会受到I/O限制,而不是CPU限制。同意,但我的主要问题是,我根本不想要任何GC—这是关于可预测性而不是直线速度的问题。@Dan,你只需要使用不同的语言。听起来像C或C++是明显的选择,尽管你可能会在.NET中用非托管代码破解足够的解决方案。使用现代JVM,您可以最大限度地减少程序停止响应的情况,但您无法消除这种情况,而且您不能不使用GC。不,我将始终使用缓存来重用对象。您看不到或控制不到的临时对象呢?在各种库中有很多东西都不知道您的内存方案。可能是这样,但是您将用于I/O的库代码可能正在某处创建对象。还有,你有没有确定这是个问题?为了速度而避免对象创建在我看来是一种代码味道。大多数情况下,你的应用程序都会受到I/O限制,而不是CPU限制。同意,但我的主要问题是,我根本不想要任何GC—这是关于可预测性而不是直线速度的问题。@Dan,你只需要使用不同的语言。听起来像C或C++是明显的选择,尽管你可能会在.NET中用非托管代码破解足够的解决方案。使用现代JVM,您可以最小化程序停止响应的情况,但是你不能消除它-你不能不使用GC。我认为有一些标志策略可以设置来确保没有垃圾收集-也许我错了。我认为有一些标志策略可以设置来确保没有垃圾收集-也许我错了。那个链接是死的链接是死的