Tag: garbage collection

使用Java 7进行转义分析/堆栈分配的资格

我正在使用Java 7中的转义分析进行一些测试,以便更好地了解哪些对象有资格进行堆栈分配。 这是我编写的用于测试堆栈分配的代码: import java.util.ArrayList; import java.util.Iterator; public class EscapeAnalysis { private static final long TIME_TO_TEST = 10L * 1000L; // 10s static class Timestamp { private long millis; public Timestamp(long millis) { this.millis = millis; } public long getTime() { return millis; } public void setTime(long time) { millis = time; } } public […]

如何确保始终调用finalize()(在Java练习中思考)

我正在慢慢地完成Bruce Eckel的Thinking in Java第4版 ,以下问题让我难过: 使用finalize()方法创建一个打印消息的类。 在main()中,创建一个类的对象。 修改上一个练习,以便始终调用finalize()。 这是我编码的: public class Horse { boolean inStable; Horse(boolean in){ inStable = in; } public void finalize(){ if (!inStable) System.out.print(“Error: A horse is out of its stable!”); } } public class MainWindow { public static void main(String[] args) { Horse h = new Horse(false); h = new Horse(true); […]

CMS垃圾收集器 – 什么时候运行?

我很困惑可能控制CMS收集器何时启动的两个参数: MaxHeapFreeRatio (默认为70%) CMSInitiatingOccupancyFraction (默认超过90%) 这些参数对每个参数意味着什么? 收集器何时开始(标记阶段),并收集(​​扫描阶段)?

垃圾收集 – 孤立的LinkedList链接

假设您有参考A -> B -> C -> D 当您从A删除对B的引用时,您将留下对象B -> C -> D的孤立链。 C和D会被垃圾收集,即使没有办法到达它们(因为没有提到B )? 我认为GC对此很聪明,并将解决任何此类依赖关系。 但是,我查看了LinkedList类的源代码 ,发现了与此相反的内容。 我注意到当列表clear() ,对每个链接的所有引用都显式设置为null ,从而使其成为O(n)操作。 这样做有什么理由/好处吗?

-XX:-PrintGC和XX:-PrintGCDetails标志做什么?

我在这里找到了JVM标志。 是否有更详细的解释他们到底做了什么?

如何通过BeanManager创建和销毁CDI(焊接)托管Bean?

我正在尝试使用BeanManager而不是Instance .select()。get()创建CDI托管bean的实例。 这被建议作为我已经使用ApplicationScoped bean和他们的家属的垃圾收集的问题的解决方法 – 请参阅CDI应用程序和依赖范围可以合谋影响垃圾收集? 为背景和这建议的解决方法。 如果在ApplicationScoped bean上使用Instance编程查找方法,Instance对象和从中获取的任何bean最终都依赖于ApplicationScoped bean,因此共享它的生命周期。 但是,如果使用BeanManager创建bean,则会在Bean实例本身上设置句柄,并且显然可以明确地销毁它,我理解这意味着它将被GCed。 我目前的方法是在BeanManagerUtil类中创建bean,并返回Bean,实例和CreationalContext的复合对象: public class BeanManagerUtil { @Inject private BeanManager beanManager; @SuppressWarnings(“unchecked”) public DestructibleBeanInstance getDestructibleBeanInstance(final Class type, final Annotation… qualifiers) { DestructibleBeanInstance result = null; Bean bean = (Bean) beanManager.resolve(beanManager.getBeans(type, qualifiers)); if (bean != null) { CreationalContext creationalContext = beanManager.createCreationalContext(bean); if (creationalContext != null) { T […]

Java并手动执行finalize

如果我从程序代码中调用一个对象的finalize() ,那么当垃圾收集器处理这个对象时, JVM是否仍会再次运行该方法? 这将是一个近似的例子: MyObject m = new MyObject(); m.finalize(); m = null; System.gc() 显式调用finalize()会使JVM的垃圾收集器不在对象m上运行finalize()方法吗?

垃圾收集器是否保证在Out of Memory Error之前运行?

如果堆已满,JVM将抛出OutOfMemoryError 。 但是它确保在抛出这样的exception之前总是发生(完全)垃圾收集吗? 这意味着当抛出exception时,内存只有强引用对象(或GC Roots可达)才能满。 编辑:假设Sun JVM – HotSpot正在讨论中。

Java:你如何使用JVMTI的ForceGargabeCollection强制GC?

我不是在寻找通常的“你只能使用System.gc()回答提示使用Java的GC”,这根本不是什么问题。 我的问题不是主观的,而是基于现实:GC 可以用Java来强制实现。 我们每天使用的许多程序都是这样做的:IntelliJ IDEA,NetBeans,VisualVM。 他们都可以强制 GC发生。 怎么做? 我认为他们都使用JVMTI,更具体地说是ForceGarbageCollection (注意“Force”),但我怎么能为自己尝试呢? http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection 还要注意,这个问题不是关于“为什么”我想要这样做:“为什么”可能是“好奇心”或“我们正在编写类似于VisualVM的程序”等。 问题实际上是“你如何使用JVMTI的ForceGarbageCollection强制GC”? 是否需要使用任何特殊参数启动JVM? 是否需要任何JNI? 如果是这样,究竟是什么代码? 它只适用于Sun VM吗? 任何完整和可编辑的例子都是最受欢迎的。

匿名类*总是*保持对其封闭实例的引用吗?

我正在使用一些代码,其中一个对象“foo”正在创建另一个对象“bar”,并将其传递给Callable 。 在此foo之后将返回bar,然后我希望foo变得无法访问(即:可用于垃圾收集)。 我最初的想法是匿名创建Callable 。 例如: class Foo { … public Bar createBar() { final int arg1 = … final int arg2 = … final int arg3 = … return new Callable() { @Override public Baz call() { return new Baz(arg1, arg2, arg3); } }; } } 在我看来,这可能实际上并不按预期工作,因为内部类通常保持对其封闭对象的引用。 我不希望在这里引用封闭类,因为我希望在Callable仍可访问时收集封闭对象。 另一方面,检测到实际上从未引用封闭实例应该是非常简单的,因此Java编译器可能足够聪明,在这种情况下不包括引用。 那么……一个匿名内部类的实例是否会持有对其封闭实例的引用,即使它实际上从未使用封闭的实例引用?