标签: soft-references

C++中的软(非弱)引用 - 是否可能?有实施吗?

在C++中,我正在使用boost::shared_ptrboost::weak_ptr自动删除不再需要的对象.我知道这些工作与引用计数.

在Java中,内存是由垃圾收集器,其consideres管理的内置对象引用为,WeakReference因为SoftReference在之间(可通过GC收集,但可能还有生存的GC)的东西,这是非常方便的用于缓存对象一段时间,但一旦可用内存不足就将它们丢弃.

所以现在我回到了C++中,我错过了软引用的安慰.我想知道软引用是否适用于引用计数.当清除对象的最后一个引用,并且仍然有一个引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.

为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以一种甚至兼容的方式boost::shared_ptr(或C++ TR1等效std::shared_ptr的方式).

如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?

编辑: 当然我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但是有太多东西要永远保存它们.

c++ boost memory-management soft-references shared-ptr

6
推荐指数
2
解决办法
1681
查看次数

使用软引用有什么"实际后果"?

根据番石榴的文档MapMaker.softValues():

警告:在大多数情况下,最好设置每缓存最大大小而不是使用软引用.如果您熟悉软引用的实际后果,则应该只使用此方法.

我对软引用有一个中间的理解 - 它们的行为,用途以及它们与垃圾收集的契约.但是我想知道这些实际后果是由博士提到的.为什么使用最大尺寸而不是软参考更好?在实现缓存方面,软引用的算法和行为是否使得它们的使用比硬编码上限更有效?

java caching garbage-collection soft-references

6
推荐指数
1
解决办法
775
查看次数

相当于.net中的SoftReference?

我很熟悉WeakReference,但我正在寻找一种在内存不足时才清除的引用类型,而不仅仅是每次gc运行时(就像Java一样SoftReference).我正在寻找一种实现内存敏感缓存的方法.

.net garbage-collection weak-references soft-references

5
推荐指数
1
解决办法
1446
查看次数

Android:Bitmaps,SoftReferences和OOM?

我在垂直LinearLayout中有一系列视图.滚动到时,每个视图都会生成并绘制一个位图.出于性能原因,每次调用onDraw()时我宁愿不生成Bitmap,但出于内存原因,我无法保留对Bitmaps的硬引用.我可以就我应该采取的策略提出建议.

我已经尝试过明显的路径:生成Bitmap,然后用SoftReference包装它.这失败有两个原因.1.参考文献收集得比我预期的要热烈得多.我还是得到了OOM!这是令人震惊的,因为没有Bitmap特别大,所以单个视图不应该导致OOM,让我假设OOM发生,因为违规的SoftReference没有被释放的机会.此外,当我的应用程序的分配堆大小为6mb时(根据DDMS视图),OOM会发生,我希望它在抛出OOM之前增长到16mb.

有什么建议?

heap android memory-management bitmap soft-references

5
推荐指数
1
解决办法
4394
查看次数

有没有办法使用Numpy数组制作软引用或类指针对象?

我想知道是否有办法将数据从许多不同的数组引用到一个数组,但没有复制它.

例:

import numpy as np
a = np.array([2,3,4,5,6])
b = np.array([5,6,7,8])

c = np.ndarray([len(a)+len(b)])

offset = 0
c[offset:offset+len(a)] = a
offset += len(a)
c[offset:offset+len(b)] = b
Run Code Online (Sandbox Code Playgroud)

但是,在上面的示例中,c是一个新数组,因此如果您修改了某个元素,a或者b根本没有修改它c.

我想的是各指标c(即c[0],c[1]等)是指两个中的每个元素ab,但像一个指针,而不进行deepcopy数据的.

python pointers numpy soft-references

5
推荐指数
1
解决办法
331
查看次数

Java中的软引用LinkedHashMap?

Java中是否存在基于softreference的LinkedHashMap?如果不是,有没有人得到我可以重用的代码片段?我保证会正确引用它.

谢谢.

java soft-references linkedhashmap

4
推荐指数
1
解决办法
5429
查看次数

了解与参考队列相关的Phantom参考与弱参考

根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html,只有当对象从内存中物理移除并且WeakReferences在最终化或垃圾收集之前排队时才会加入PhantomReferences实际发生了.

区别在于排队发生的时间.WeakReferences在它们指向的对象变得无法访问时立即排队.这是在最终确定或垃圾收集实际发生之前; 理论上,对象甚至可以通过非正统的finalize()方法"复活",但WeakReference仍然会死亡.只有在从内存中物理移除对象时,才会将PhantomReferences排队,并且get()方法始终返回null,以防止您"复活"几乎死亡的对象.

而根据http://www.ibm.com/developerworks/library/j-refs/,在释放堆对象之前将PhantomReference添加到其ReferenceQueue中,并在完成或垃圾回收后将WeakReferences添加到其ReferenceQueue.

与软引用和弱引用不同,PhantomReference在释放堆对象之前会添加到其ReferenceQueue中.(请记住,必须使用关联的ReferenceQueue创建所有PhantomReference对象.)这允许在回收堆对象之前采取操作.

当运行堆对象的finalize()方法并释放其内存时,WeakReference对象将添加到其ReferenceQueue(如果存在).

我很迷惑.哪一个是正确的?

基本上我想知道关于Reference Queue的弱引用和幻像引用之间的区别?

java garbage-collection weak-references phantom-reference soft-references

4
推荐指数
1
解决办法
2465
查看次数

有没有办法在GC确定无法访问时回收复杂的java对象

在C++中,我使用引用计数对象来填充"自动"回收对象池

SmartPointer<ObjType> object = pool.getObject(); // hold reference

// ... do stuff with object over time.

object = nullptr; // that is when reference 
                  // count goes to 0
Run Code Online (Sandbox Code Playgroud)

- 现在我在C++对象上有一个"onFinalRelease()"方法,当refcount达到0时会被调用.我可以覆盖它(默认是delete(this))来自动回收对象而不是销毁它们.

问题是我可以使用java引用类型和引用池的某种组合来实现此模式.当然,这对于一种大型复杂的昂贵而言,在有意义的情况下创建对象.那是我想做的:

SomeReference r = referenceQueue.getReference();

pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????
Run Code Online (Sandbox Code Playgroud)

这真是太棒了:)

java garbage-collection weak-references phantom-reference soft-references

3
推荐指数
1
解决办法
1608
查看次数

如果存在两级软引用对象,GC将执行什么操作

我知道在Java中我们有软引用的概念.如果:

1)软引用"sf"指对象A.

2)在对象A中,它具有强引用,指对象B.

3)对象A和B不在任何其他地方引用.

根据定义,对象A和对象B都"可以轻柔地到达",对吗?

然后说我们现在用完了内存,GC开始了.是否有可能GC会回收对象B而不是对象A?

如果是这种情况,稍后如果我们想通过"sf"访问对象B,它将为null.java如何避免这种情况发生?

我在java doc中没有看到任何解释.

java garbage-collection soft-references

3
推荐指数
1
解决办法
151
查看次数

当您丢弃对 SoftReference 的引用时,它的清除仍会放在 ReferenceQueue 上吗?

我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 OOM 时发生,但是如果您完全丢弃引用,GC 会出现并收集 SoftReference 可能会注意到不存在其他强/软引用并清除内部引用值。

ReferenceQueue<Object> cleared = new ReferenceQueue<>();
Object X = new Object();
SoftReference<Object> Xs = new SoftReference<>(X, cleared);

Thread.sleep(10);
X = null;
Xs = null;

System.GC();
Thread.sleep(100);
Reference ref;
while ((ref = cleared.poll()) != null) {
   System.err.println(ref);
}
Run Code Online (Sandbox Code Playgroud)

那么关于这个队列的规则记录在哪里?一定有比我问的更多的极端情况,所以也许这个问题必须扩大一点。

java garbage-collection soft-references java-memory-model

3
推荐指数
1
解决办法
99
查看次数