有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无gc io的垃圾收集Java

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

谢谢 丹尼尔


共 (6) 个答案

  1. # 1 楼答案

    Managing memory in my own code is not so difficult.

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

    public void foo() {
      Object o = new Object();
    
      // free(o); // Doh! No "free" keyword in Java.
    }
    

    如果没有垃圾收集器的帮助o所消耗的内存如何被回收

    根据您的问题,我假设您可能希望避免由于应用程序执行的高级别I/O而导致的垃圾收集引起的零星暂停。在这种情况下,有一些技术可以最大限度地减少创建的对象数量(例如,重新使用池中的对象)。您也可以考虑启用Concurrent Mark Sweep Collector

    The concurrent mark sweep collector, also known as the concurrent collector or CMS, is targeted at applications that are sensitive to garbage collection pauses.

  2. # 2 楼答案

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

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

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

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

  3. # 3 楼答案

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

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

    因此,在您开始考虑使用什么优化之前,先建立一个基线,在那里您有一个大型的未优化程序和概要文件然后做一些调整,看看是否有帮助,但你永远不会知道你是否没有基线

  4. # 4 楼答案

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

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

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

  5. # 5 楼答案

    GarbageCollection是java中的自动内存管理。所以你不能禁用GC

  6. # 6 楼答案

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

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

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

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

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