当前位置: 首页 > 后端技术 > Java

Guava避免OOM的注意点

时间:2023-04-01 22:54:53 Java

gvaua缓存使用堆内存,所以使用不当会出现OOM问题保持上限privatestaticCachecache=CacheBuilder.newBuilder().maximumSize(5).构建();publicstaticvoidmain(String[]args){for(inti=0;i<10;i++){cache.put(String.valueOf(i),i);}System.out.println(cache.asMap());}输出结果{6=6,9=9,8=8,7=7,5=5}设置有效期//当写入速度大于失败速度,会出现OOM,所以要同时设置上限privatestaticCachecache=CacheBuilder.newBuilder().expireAfterWrite(2,TimeUnit.SECONDS).build();publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=0;i<10;i++){cache.put(String.valueOf(i),i);}Thread.sleep(3000);System.out.println(cache.asMap());}outputresult{}setcolddatavalidityperiod//当写入速度大于失效速度时,会出现OOM,所以上限也要设置一样时间privatestaticCachecache=CacheBuilder.newBuilder().expireAfterAccess(2,TimeUnit.SECONDS).build();publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=0;i<10;i++){cache.put(String.valueOf(i),i);}Thread.sleep(1000);cache.getIfPresent("5");线程.睡眠(1000);System.out.println(cache.asMap());}输出结果{5=5}设置引用规则privatestaticCachecache=CacheBuilder.newBuilder().build();publicstaticvoidmain(String[]args)throwsInterruptedException{while(true){cache.put(UUID.randomUUID().toString(),newString());}}线程“main”中的输出结果异常java.lang.OutOfMemoryError:在sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:265)Exception:java.lang.OutOfMemoryErrorthrownfromtheUncaughtExceptionHandlerinthread"main"调整后不会OOMprivatestaticCachecache=CacheBuilder.newBuilder().weakKeys().build();CacheBuilder.weakKeys():当没有其他(强或软)引用指向键时,使用弱引用来存储键,缓存条目可以被垃圾收集。CacheBuilder.weakValues():使用弱引用来存储值。当值没有其他(强或软)引用时,可以对缓存条目进行垃圾回收。CacheBuilder.softValues():使用软引用来存储值。软引用仅在响应内存需求时以全局最近最少使用的顺序回收。