网站建设都,湘潭做网站价格 q磐石网络,机械加工网上平台,wordpress 安装 404概述
平时在编写代码的时候内存都是由jvm管理#xff0c;对象的回收也是jvm在管理#xff1b; 但是有些时候jvm无法回收对象#xff0c;最后就会抛出oom异常.
那么那些回收不了的对象肯定有区别于能回收的对象#xff1b;
先上一波引用类型介绍
强引用
比如平常我们直…概述
平时在编写代码的时候内存都是由jvm管理对象的回收也是jvm在管理 但是有些时候jvm无法回收对象最后就会抛出oom异常.
那么那些回收不了的对象肯定有区别于能回收的对象
先上一波引用类型介绍
强引用
比如平常我们直接new的对象一个对象具有强引用那垃圾回收器是不会去回收的内存不足时就直接抛oom异常;强引用对象的回收一般要么手动set null要么就是超出自己的生命周期比如方法结束后方法内new的变量就结束自己的生命周期了. 官方说法一个方法的内部有一个强引用这个引用保存在Java栈中而真正的引用内容(Object)保存在Java堆中。 当这个方法运行完成后就会退出方法栈则引用对象的引用数为0这个对象会被回收。
常见的ArrayList的clear()就是手动赋值null 软引用(SoftReference)
如果一个对象只具有软引用则内存空间充足时垃圾回收器就不会回收它如果内存空间不足了就会回收这些对象的内存。只要垃圾回收器没有回收它该对象就可以被程序使用。
// 强引用
String strongReference new String(abc);
// 软引用
String str new String(abc);
SoftReferenceString softReference new SoftReferenceString(str);软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引用所引用对象被垃圾回收JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。 软引用对象是在jvm内存不够的时候才会被回收我们调用System.gc()方法只是起通知作用JVM什么时候扫描回收对象是JVM自己的状态决定的。就算扫描到软引用对象也不一定会回收它只有内存不够的时候才会回收。 ReferenceQueueString referenceQueue new ReferenceQueue();
String str new String(abc);
SoftReferenceString softReference new SoftReference(str, referenceQueue);str null;
// Notify GC
System.gc();System.out.println(softReference.get()); // abcReference? extends String reference referenceQueue.poll();
System.out.println(reference); //null当内存不足时JVM首先将软引用中的对象引用置为null然后通知垃圾回收器进行回收
if(JVM内存不足) {// 将软引用中的对象引用置为nullstr null;// 通知垃圾回收器进行回收System.gc();
}垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的较新的软对象会被虚拟机尽可能保留;
比如浏览器回退时的内容获取就可以使用软引用
// 获取浏览器对象进行浏览
Browser browser new Browser();
// 从后台程序加载浏览页面
BrowserPage page browser.getPage();
// 将浏览完毕的页面置为软引用
SoftReference softReference new SoftReference(page);// 回退或者再次浏览此页面时
if(softReference.get() ! null) {// 内存充足还没有被回收器回收直接获取缓存page softReference.get();
} else {// 内存不足软引用的对象已经回收page browser.getPage();// 重新构建软引用softReference new SoftReference(page);
}弱引用(WeakReference)
弱引用与软引用的区别在于只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中一旦发现了只具有弱引用的对象不管当前内存空间足够与否都会回收它的内存。不过由于垃圾回收器是一个优先级很低的线程因此不一定会很快发现那些只具有弱引用的对象。
String str new String(abc);
WeakReferenceString weakReference new WeakReference(str);
str null;JVM首先将软引用中的对象引用置为null然后通知垃圾回收器进行回收
str null;
System.gc();让一个弱引用再次变为一个强引用
String str new String(abc);
WeakReferenceString weakReference new WeakReference(str);
// 弱引用转强引用
String strongReference weakReference.get();同样弱引用可以和一个引用队列(ReferenceQueue)联合使用如果弱引用所引用的对象被垃圾回收Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
虚引用(PhantomReference)
虚引用顾名思义就是形同虚设。与其他几种引用都不同虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用那么它就和没有任何引用一样在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。 虚引用与软引用和弱引用的一个区别在于
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象的内存之前把这个虚引用加入到与之关联的引用队列中。
String str new String(abc);
ReferenceQueue queue new ReferenceQueue();
// 创建虚引用要求必须与一个引用队列关联
PhantomReference pr new PhantomReference(str, queue);参考了大佬的博文 https://juejin.cn/post/6844903665241686029