- 软引用
- softRefrence创建的对象,该对象在内存不足的时候会被回收,不会产生内存溢出
- 当一个对象与gc roots间存在强引用时,无论何时都不会被gc回收
- 软引用对象在内存不足的时候会被回收,并且刚刚构建的软引用会尽可能保留
- 有效解决oom问题
- 适合缓存非必须的大对象
String s = new String("test");
SoftRefrence<String> softRef = new SoftRefrence<String>(s);
s = null;
if(softRef != null){
s= softRef.get();
}
- 在垃圾回收期回收对象之前,softRefrence类的get方法会返回java对象的强引用
- 应用:图片缓存
- 软可达对象被回收后,虽然softRefrence的get()为null,但softRefrence本身并不是null,会有内存泄漏问题
- RefrenceQueue用来保存被清理的引用的,软引用可以和和引用队列联合使用,软引用对象别垃圾回收期回收,jvm将软引用加入队列中
- JIT(just in time)
- 编译器:1·前端 与源语言有关,与目标机无关 .java–>.class。2·与目标机有关 .class–>机器指令
- 加速java程序执行的速度
- java是解释型语言或者半编译、半解释,先用javac变异成平台无关的字节码文件.class,再由jvm解释执行字节码文件,解释执行的实质为 jvm将字节码翻译为对应的机器指令,然后执行机器指令。
- 当某个method、代码块运行频繁时,Jit将热点代码编译成本地机器相关的机器码,并进行优化,然后将机器码缓存
jvm参数
- SoftRefLRUPolicyMSPerMB = 50 :软引用存活时间参数,如果当前jvm内存有1000MB,name存活时间是1000*50 = 50s
- ReservedCodeCacheSize=240m :设置code cache大小,jit编译的代码放在code cache,code cache空间不足无法编译,编译执行改为解释执行
- +UseConcMarkSweepGC :CMS。1·初始标记:程序暂停,收集gc roots 直接引用的对象(存在于新生代或者老年代)并标记,2·并发标记:与程序并发执行,从直接引用对象出发,扫描、标记可达对象,3·并发预清理:将新生代中在并发标记中晋升到老年代的对象进行清理,减少下一阶段重新扫描标记的对象数量
- +CMSScavengeBeforeRemark :开启在remark(4)之前强制对新生代执行一次minor gc,4·重新标记:程序暂停 对并发标记(2)中状态发生变化的对象进行重新标记,5·并发清除:将没有标记为可达的对象进行清除
- +PrintGCDetails:打印详细的gc日志
- cms缺点:基于标记清除算法,造成内存碎片,使用 +UseCMSCompactAtFullCollection 和 CMSFullGCsBeforeCompaction=1 配置进行full gc时,对老年代进行压缩处理掉内存碎片,1表示进行了1次full gc后执行内存压缩