Tag: 弱引用

迭代WeakHashMap

我正在同时使用WeakHashMap。 我想基于Integer参数实现细粒度锁定; 如果线程A需要修改由Integer a标识的资源,并且线程B对由Integer b标识的资源执行相同的操作,则它们不需要同步。 但是,如果有两个线程使用相同的资源,假设线程C也使用由整数a标识的资源,那么当然线程A和C需要在同一个锁上同步。 当没有更multithreading需要具有ID X的资源时,可以删除Map中用于key = X的Lock。 但是,另一个线程可以在此时进入并尝试在Map中使用ID = X的锁,因此在添加/删除锁时我们需要全局同步。 (这将是每个线程必须同步的唯一地方,无论Integer参数如何)但是,线程无法知道何时删除锁,因为它不知道它是使用锁的最后一个线程。 这就是我使用WeakHashMap的原因:当不再使用ID时,可以在GC需要时删除键值对。 为了确保我对已存在的条目的键具有强引用,并且确切地说是构成映射关键字的对象引用,我需要迭代映射的keySet: synchronized (mrLocks){ // … do other stuff for (Integer entryKey : mrLocks.keySet()) { if (entryKey.equals(id)) { key = entryKey; break; } } // if key==null, no thread has a strong reference to the Integer // key, so no thread […]

有没有办法在Java中强制使用弱的和/或软引用的对象?

这是我的用例。 我们正在尝试缩小应用程序中潜在的内存泄漏,我们正在使用内存分析工具对堆进行快照,以便我们可以查找对象实例和引用。 (如果它有帮助,我们正在使用YourKit。) 此应用程序广泛使用动态和CGLIB代理,最终在WeakHashMaps中存储大量类和类加载器的引用。 在我们的测试用例运行之后,我们期望对对象X及其类加载器的所有硬引用都消失了,但是由于测试用例中涉及很多代理,我们还有许多弱/软引用。 (我只能找到WeakHashMap引用,但是YourKit将弱引用和软引用都包含在摘要中的一个行项中,所以我不能确定我在某个地方没有错过软引用。) 即使在从JVM请求完整GC之后也是如此。 (在服务器模式下使用sun 1.6.0_23 JDK。) 似乎 JVM承认只有弱/软引用这些对象,但我不能强迫它对GC这些事情是100%肯定的。 (所以,我想要的是,它完全从堆中消失,其permgen的类加载器使用也会消失。) 任何人都知道配置和/或强制JVM处理仅软/弱引用的对象的方法吗?

WeakHashMap和强引用值

Javadocs说:“当一个密钥被丢弃时,它的条目将被有效地从地图中删除”。 但除非有另一个线程偶尔删除这样的Map.Entry条目,否则地图不会强烈引用值对象? 但是由于没有运行这样的线程,只有get方法调用可以删除这些条目 – 一次一个。 因为这个原因WeakHashMap<K, WeakReference>我几乎总是使用WeakHashMap<K, WeakReference> 。 为什么他们没有将默认行为 – 值作为弱引用呢?

如何降低GC期间的弱ref处理时间?

目前我遇到的问题是我的应用程序偶尔会显示很长的GC时间,但所有这些只是由弱参考处理引起的。 所以线程停止的时间总是接近弱的ref处理时间。 所有其他GC循环均为0.0001秒至0.200秒。 从gc.log(重新格式化): 10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) , 0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs] [1 CMS-remark: 2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs] [Times: user=2.51 sys=0.00, real=2.18 secs] Total time for which application threads were stopped: 2.1906890 seconds 目前我已经有了这些设置。 尝试更简单的设置,但没有变化。 -Xms4g -Xmx4g -XX:NewSize=128m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=50 -XX:CMSInitiatingOccupancyFraction=50 -XX:ParallelGCThreads=16 -XX:+DisableExplicitGC 如果我打开NewSize,我最终会得到很长的正常GC循环。 该机器有8个内核,并没有为应用程序烧掉那么多的CPU。 […]

WeakReference to String和String常量

我从维基百科看到了关于弱引用的这个例子: import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) throws InterruptedException { WeakReference r = new WeakReference(new String(“I’m here”)); WeakReference sr = new WeakReference(“I’m here”); System.out.println(“before gc: r=” + r.get() + “, static=” + sr.get()); System.gc(); Thread.sleep(100); // only r.get() becomes null System.out.println(“after gc: r=” + r.get() + “, static=” + sr.get()); […]

ArrayList <WeakReference > – 如何整理好?

两者之间的一个简单问题:我有一个简单的WeakRunnableList。 这样可以清理它 (删除死引用),还是有一个更优雅,更快的解决方案。 WeakRunnableList的完整源代码: public class WeakRunnableList { private ArrayList<WeakReference> _items = new ArrayList<WeakReference>(); public void Add(Runnable r) { _items.add(new WeakReference(r)); } public void Execute() { ArrayList<WeakReference> remove = new ArrayList<WeakReference>(); for (WeakReference item : _items) { Runnable tempCheck = item.get(); if (tempCheck == null) { remove.add(item); } else { tempCheck.run(); } } _items.removeAll(remove); } […]

如何避免回调中的内存泄漏?

有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。 如果您实现客户端注册回调但未明确注销回调的API,则除非您采取某些操作,否则它们将累积。 确保回调被及时垃圾回收的最佳方法是仅存储对它们的弱引用,例如,通过仅将它们存储为WeakHashMap中的键。 我是Java的初学者。 有人可以教我如何在回调中创建弱引用并告诉我它们如何解决内存泄漏问题? 谢谢。

使用Java的ReferenceQueue

SoftReference和WeakReference真的只在创建为实例变量时才有用吗? 在方法范围内使用它们有什么好处吗? 另一个重要的部分是ReferenceQueue 。 除了能够跟踪哪些引用被确定为垃圾之外,还可以使用Reference.enqueue()来强制注册垃圾回收对象吗? 例如,是否值得创建一个方法,该方法在对象中占用大量内存资源(由强引用保存)并创建引用以将它们排入队列? Object bigObject; public void dispose() { ReferenceQueue queue = new ReferenceQueue(); WeakReference ref = new WeakReference(bigObject, queue); bigObject = null; ref.enqueue(); } (想象一下,在这种情况下,Object表示一个使用大量内存的对象类型……比如BufferedImage或者其他东西) 这有什么现实的效果吗? 或者这只是浪费代码?