- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 MapMaker 创建一个缓存大对象的 map ,
如果没有足够的内存,应该从缓存中删除它。
这个小演示程序似乎工作正常:
public class TestValue {
private final int id;
private final int[] data = new int[100000];
public TestValue(int id) {
this.id = id;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalized");
}
}
public class Main {
private ConcurrentMap<Integer, TestValue> cache;
MemoryMXBean memoryBean;
public Main() {
cache = new MapMaker()
.weakKeys()
.softValues()
.makeMap();
memoryBean = ManagementFactory.getMemoryMXBean();
}
public void test() {
int i = 0;
while (true) {
System.out.println("Etntries: " + cache.size() + " heap: "
+ memoryBean.getHeapMemoryUsage() + " non-heap: "
+ memoryBean.getNonHeapMemoryUsage());
for (int j = 0; j < 10; j++) {
i++;
TestValue t = new TestValue(i);
cache.put(i, t);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Main m = new Main();
m.test();
}
}
data = new MapMaker()
.softValues()
.makeMap();
public void test() {
int i = 0;
while (true) {
for (final Entry<Integer, TestValue> entry :
data.entrySet()) {
if (entry.getValue() == null) {
data.remove(entry.getKey());
}
}
System.out.println("Etntries: " + data.size() + " heap: "
+ memoryBean.getHeapMemoryUsage() + " non-heap: "
+ memoryBean.getNonHeapMemoryUsage());
for (int j = 0; j < 10; j++) {
i++;
TestValue t = new TestValue(i);
data.put(i, t);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
}
最佳答案
有很多事情可能会发生,但是对于使用软值的测试程序:即使您有尚未被垃圾收集的 SoftReferences,您也可能得到 OutOfMemoryError。值得重申的是:即使您有尚未清除的 SoftReferences,您也可能会收到 OutOfMemoryError。
SoftReferences 有点奇怪,见 http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html用于描述当前力学。很可能在您的测试用例中,GC 只是没有时间进行两次完整的 GC。
当您使用弱键时,CG 会立即清除它们,而不必等待完整的 GC 暂停。 (b/c WeakReferences 被积极收集。)
在我看来,如果你想要一个带有 Integer 键的内存敏感缓存,我认为以下是合适的:
data = new MapMaker().softValues().makeMap();
Map<Integer,String> map = new MapMaker().weakKeys().makeMap();
Integer a = new Integer(1);
Integer b = new Integer(1);
Integer c = 1; //auto box
Integer d = 1; //auto box
map.put(a, "A");
map.put(b, "B");
map.put(c,"C");
map.put(d,"D");
map.size() // size is 3;
关于guava - 使用 MapMaker 创建缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3210606/
我对谷歌的 MapMaker 印象深刻设计。我想知道这里使用的模式的名称是什么? (我认为它有点像装饰器模式,但我们不必将对象包装在其他对象中以扩展功能,但我无法弄清楚它到底是哪种模式。) MapMa
我想使用 MapMaker 创建一个缓存大对象的 map , 如果没有足够的内存,应该从缓存中删除它。 这个小演示程序似乎工作正常: public class TestValue { priv
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Why is softKeys() deprecated in Guava 10? 原因MapMaker.softK
MapMaker maximumSize 在 google guava 库中被标记为 @Beta。当您将它用作缓存时设置最大大小是一个非常有用的功能,我想在生产代码中使用它。从使用其他谷歌产品的经验来
我需要一个带有弱键或软键的并发 HashMap ,其中等式是 equals 而不是 ==。 对于此类键,Google Collection 默认选择 ==。 有没有办法覆盖这个选择?我应该如何进行?
我刚看到这个answer in SO其中提到 Google Collection MapMaker太棒了。我仔细阅读了文档,但无法真正弄清楚我可以在哪里使用它。任何人都可以指出一些适合使用 MapMa
当映射中的条目具有弱键引用时,该条目将在下一次垃圾收集时被删除,对吗? 可以理解为MapMaker类提供了weakKeys方法。但我对 weakValue() 感到困惑。我什么时候应该在 MapMak
我想知道目前是否有一种方法可以使用 Guava MapMaker 或将使用 CacheBuilder 来提供计算缓存是否在最大大小范围内的函数? 看起来目前的驱逐只是基于缓存中的元素数量与 .maxi
我需要获取慢速方法的结果slowResult()对于类 Something 的实例。单独缓存并没有什么帮助,因为实例几乎不会重复。幸运的是,我知道结果实际上只取决于一些容易获得的Attributes的
我们有一台缓慢的后端服务器,正在被负载压垮,并且我们希望中间层 Scala 服务器对于每个唯一的查找只有一个对后端的未完成请求。 后端服务器只存储不可变的数据,但当有新数据添加时,中间层服务器会代表客
我读过很多人真的很喜欢 MapMaker Google Guava(集合),但是我看不到它有任何好的用途。 我已经阅读了 javadoc,它说它的行为类似于 ConcurrentHashMap .它还
我尝试使用 MapMaker/CacheBuilder 制作缓存,但我不明白如何正确处理空值。 ConcurrentMap graphs = new MapMaker() .concu
我正在使用 MapMaker 在我的应用程序中实现数据对象的缓存: public class DataObjectCache { private final ConcurrentMap inn
我刚刚下载了最新版本的 Guava com.google.guava guava 20.0-hal 我发现 MapMaker 类不再有方法 expiration,我发现它
我们有一个 Scala 服务器,它通过套接字使用 Protocol Buffers 获取节点树,我们需要将额外的数据附加到每个节点。 在单线程上下文中,当节点树和关联数据将同时删除它们的强引用时(由于
我不习惯处理 Java 中的软引用和弱引用,但我理解其中的原理,因为我习惯处理像 Gemfire 这样的数据网格,它在内存已满时提供溢出到硬盘功能,可能使用软引用或我猜是类似的东西。 我在 Guava
我正在尝试将 apache Spark 与 spring-boot cassandra 项目集成。但在运行项目时出现以下错误: Servlet.service() for servlet [d
这可能是预期的行为,但我找不到任何这样说明的文档。我正在使用 Guava 14.0.1。在下面的示例中, map 中没有对键的强引用的条目被删除,这是我所期望的,但 map 的大小变得不同步。 在第一
我用的是 Guava 17.0 private static final ConcurrentMap imageMap = new MapMaker().softValues().ma
我在使用 google-guava 的 MapMaker 时遇到问题。这是代码: package test; import java.lang.ref.SoftReference; import ja
我是一名优秀的程序员,十分优秀!