在C++中,我正在使用boost::shared_ptr并boost::weak_ptr自动删除不再需要的对象.我知道这些工作与引用计数.
在Java中,内存是由垃圾收集器,其consideres管理的内置对象引用为强,WeakReference因为弱和SoftReference在之间(可通过GC收集,但可能还有生存的GC)的东西,这是非常方便的用于缓存对象一段时间,但一旦可用内存不足就将它们丢弃.
所以现在我回到了C++中,我错过了软引用的安慰.我想知道软引用是否适用于引用计数.当清除对象的最后一个强引用,并且仍然有一个软引用时,它什么时候会被删除?我可以想到一些方案,但对我来说似乎都不聪明.
为了防止软引用和引用计数有适当的语义,我想知道这是否已经实现,可能是以一种甚至兼容的方式boost::shared_ptr(或C++ TR1等效std::shared_ptr的方式).
如果两个问题的答案都是否定的,那么对象缓存场景中的替代方案是什么?
编辑: 当然我说的是缓存实际上很有用的情况,因为构造对象的成本很高(想想几次访问数据库和网络查询),但是有太多东西要永远保存它们.
根据番石榴的文档MapMaker.softValues():
警告:在大多数情况下,最好设置每缓存最大大小而不是使用软引用.如果您熟悉软引用的实际后果,则应该只使用此方法.
我对软引用有一个中间的理解 - 它们的行为,用途以及它们与垃圾收集的契约.但是我想知道这些实际后果是由博士提到的.为什么使用最大尺寸而不是软参考更好?在实现缓存方面,软引用的算法和行为是否使得它们的使用比硬编码上限更有效?
我很熟悉WeakReference,但我正在寻找一种仅在内存不足时才清除的引用类型,而不仅仅是每次gc运行时(就像Java一样SoftReference).我正在寻找一种实现内存敏感缓存的方法.
我在垂直LinearLayout中有一系列视图.滚动到时,每个视图都会生成并绘制一个位图.出于性能原因,每次调用onDraw()时我宁愿不生成Bitmap,但出于内存原因,我无法保留对Bitmaps的硬引用.我可以就我应该采取的策略提出建议.
我已经尝试过明显的路径:生成Bitmap,然后用SoftReference包装它.这失败有两个原因.1.参考文献收集得比我预期的要热烈得多.我还是得到了OOM!这是令人震惊的,因为没有Bitmap特别大,所以单个视图不应该导致OOM,让我假设OOM发生,因为违规的SoftReference没有被释放的机会.此外,当我的应用程序的分配堆大小为6mb时(根据DDMS视图),OOM会发生,我希望它在抛出OOM之前增长到16mb.
有什么建议?
我想知道是否有办法将数据从许多不同的数组引用到一个数组,但没有复制它.
例:
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]等)是指两个中的每个元素a和b,但像一个指针,而不进行deepcopy数据的.
Java中是否存在基于softreference的LinkedHashMap?如果不是,有没有人得到我可以重用的代码片段?我保证会正确引用它.
谢谢.
根据链接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
在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
我知道在Java中我们有软引用的概念.如果:
1)软引用"sf"指对象A.
2)在对象A中,它具有强引用,指对象B.
3)对象A和B不在任何其他地方引用.
根据定义,对象A和对象B都"可以轻柔地到达",对吗?
然后说我们现在用完了内存,GC开始了.是否有可能GC会回收对象B而不是对象A?
如果是这种情况,稍后如果我们想通过"sf"访问对象B,它将为null.java如何避免这种情况发生?
我在java doc中没有看到任何解释.
我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 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)
那么关于这个队列的规则记录在哪里?一定有比我问的更多的极端情况,所以也许这个问题必须扩大一点。