我读过很多线程,无法关闭Sun的JVM上的垃圾回收。但是,为了我们的研究项目的目的,我们需要这个功能。任何人都可以推荐一个没有垃圾收集或允许关闭的JVM实现吗?谢谢。没有垃圾回收的JVM
回答
我想找到一种快速的方法来保存所有对象的内存,以获得简单的初始概念验证。
执行此操作的简单方法是运行带有一个非常大的GC以便GC无需运行的堆栈的JVM。设置-Xmx
和-Xms
选择一个较大的值,然后打开GC日志记录,以确认GC没有为您的测试期间运行。
这比修改JVM更快更直接。
(事后看来,这可能无法正常工作。我依稀记得看到有证据表明暗示JVM不总是尊重-Xms
设置,尤其是如果这是真的大了。不过,这种做法是值得在尝试一些更加困难的方法之前尝试...像修改JVM一样)。
此外,整个事情让我感到不必要的(即使是反效果的),你实际上试图达到的目标。 GC不会丢弃物体,除非它们是垃圾。如果它们是垃圾,你将无法使用它们。 GC禁用/取消的系统的性能不会指示应用程序将如何执行。
Sun的JVM没有这样的选项。 AFAIK,其他的JVM都没有这个选项。
你没有说明你正准备实现的是什么,但是你有两个选择之一:或者使用一个探查器,看看GC正在做什么,这样你就可以考虑到它的影响。另一个是从源代码中编译一个JVM,并从那里禁用GC。
感谢您的回答。我基本上是分析Java程序。我想找到一种快速的方法来将所有对象保存在内存中,以进行简单的初始概念验证。 – 2010-06-05 11:49:08
根据您的需求,这或许可以工作:
使用您可以指定自己的实现API类的-Xbootclasspath选项。然后你可以重写Object的实现,并将其添加到构造函数globalList.add(this)
中以防止对象被垃圾收集。这确实是一种破解,但对于简单的案例研究来说,这可能就足够了。
另一种选择是采用开源jvm并注释启动垃圾回收的部分。我猜想这并不复杂。
也许你可以尝试让你的虚拟机的可用内存足以让GC永远不会运行。
我(allbeit有限)的经验使我认为,虚拟机,默认情况下,极其懒惰,极不情愿运行GC。
给-Xmx 16384M(或其他一些),并确保你的研究对象保持在这个极限以下,可能会给你你想获得的环境,尽管如此,它显然不能得到保证。
你可以得到一个开源的JVM,并禁止GC,例如Sun's Hotspot?
如果没有垃圾收集你认为这样的代码的语义是什么?
public myClass {
public void aMethod() {
String text = new String("xyz");
}
}
在没有GC的情况下,任何新的项目和堆栈作用域引用都不能被回收。即使你自己的类可以决定不使用这样的局部变量,或者只使用基本类型,我也不会看到你将如何安全地使用任何标准的Java库。
我很想知道更多关于您的使用场景。
如果我有这个问题,我会得到IBM的Jikes Research Virtual Machine因为:
- 运行时系统是用Java编写本身(特别扩展)
- 整个事情被设计成一个研究车辆并且相对容易调整。
你不能永远关闭GC,因为Java程序做分配和最终你会耗尽内存,但它很可能,你可以通过告诉延迟GC为您的实验期间JVM不会开始收集,直到堆变得非常大。 (这个技巧也可能适用于其他JVM,但我不知道在哪里找到旋钮来开始捻转。)
看一看Oracle's JRockit JVM。我已经看到这款JVM在英特尔硬件上具有非常好的近似确定性能,并且您可以使用Mission Control实用程序刺激并戳穿运行时,以了解它的表现如何。
尽管无法完全关闭GC,但我相信您可以使用-Xnoclassgc选项来禁用类的集合。可以将GC调整为minimize latency,但会增加内存消耗。如果您要走此路线,您可能需要许可证才能将延迟降至最低。
还有一个JRockit JVM的实时版本可用,但我不认为有这个可用的免费开发版本。
只有在GC没有真正需要时才能关闭GC(否则您的应用程序将耗尽内存),并且如果您不需要GC,则无法运行GC。
最简单的选择是不放弃任何对象,这将避免执行GC(并且将最大内存设置得非常高,以免用完)。
您可能会发现启动时启动GC,并且运行时可能会认为运行不可接受。
实际上存在一个肮脏的黑客来临时暂停GC。首先在Java中创建一个虚拟数组。然后,在JNI中,使用GetPrimitiveArrayCritical函数来获取指向数组的指针。 Sun JVM将禁用GC以确保数组永远不会移动并且指针保持有效。要重新启用GC,可以在指针上调用ReleasePrimitiveArrayCritical函数。但是这是非常具体的实现,因为其他VM impl可能会锁定对象而不是完全禁用GC。(测试在Oracle jdk的工作7 & 8)
您能否提供您所说的方法的源代码[Test Setup]? – Pushparaj 2015-03-13 13:58:54
问题是旧的,但对于那些谁可能会感兴趣,还有就是
开发GC只处理内存分配的建议,但不实现任何实际的内存回收机制。一旦可用的Java堆耗尽,请执行有序的JVM关闭。
JEP draft: Epsilon GC: The Arbitrarily Low Overhead Garbage (Non-)Collector
- 1. 有没有垃圾收集器的JVM?
- 2. 默认的垃圾收集的JVM
- 3. JDBC垃圾回收
- 4. Java:垃圾回收
- 5. C#垃圾回收
- 6. Java:垃圾回收
- 7. Erlang垃圾回收
- 8. java垃圾回收
- 9. Python垃圾回收
- 10. JS垃圾回收
- 11. Javascript垃圾回收
- 12. PhoneGap垃圾回收
- 13. java - 垃圾回收
- 14. 热点JVM垃圾收集器
- 15. 如何分析JVM垃圾收集?
- 16. Perl中的垃圾回收
- 17. 有资格垃圾回收的对象
- 18. 垃圾回收问题
- 19. Java垃圾回收5
- 20. asp.net垃圾回收通知
- 21. nodejs垃圾回收输出
- 22. .Net 4垃圾回收
- 23. context.detach - 用于垃圾回收
- 24. 垃圾回收太慢
- 25. Python线程垃圾回收
- 26. 查找垃圾回收根
- 27. 垃圾回收和cgo
- 28. Spidermonkey和垃圾回收
- 29. 每100秒垃圾回收
- 30. 垃圾回收Java类
无渣垃圾收集,就像,以及C/C++! – 2010-06-05 10:48:48
根据http://forums.java.net/jive/thread.jspa?messageID=208939&tstart=0在早期版本的Java中可以禁用gc,但不再可能。 – 2010-06-05 10:50:11
@米奇小麦,没有。它远离C++ **,没有缓冲区溢出,很少或没有未定义的行为。 – 2010-06-05 14:05:45