当前位置: 首页 > news >正文

必应搜索引擎网站网站维护合同范本

必应搜索引擎网站,网站维护合同范本,哪有免费的简历模板,wordpress高仿公众号文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收#xff0c;就是内存泄露#xff08;累积可能导致OOM#xff09;。 1、引用之… 文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收就是内存泄露累积可能导致OOM。 1、引用之强软弱虚 Reference强引用SoftReference软引用WeakReference弱引用PhantomReference虚引用 Java 允许使用 finalize方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作遗言时机。 //since Java9已过期 public class MyObject {Overrideprotected void finalize() throws Throwable {//finalize用于在对象被不可撤销的丢弃之前执行的操作System.out.println(----invoke finalize method ~);} } 2、强引用 当内存不足JVM开始垃圾回收对于强引用的对象就算是出现了OOM也不会对该对象进行回收死都不收。 强引用是最常见的普通对象引用只要还有强引用指向一个对象就能表明对象还“活着”垃圾收集器不会碰这种对象 //eg Student student new Student();在Java 中最常见的就是强引用把一个对象赋给一个引用变量这个引用变量就是一个强引用 当一个对象被强引用变量引用时它处于可达状态它是不可能被垃圾回收机制回收的即使该对象以后永远都不会被用到JVM也不会回收 因此强引用是造成Java内存泄漏的主要原因之一 对于一个普通的对象如果没有其他的引用关系只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null一般认为就是可以被垃圾收集的了(当然具体回收时机还是要看垃圾收集策略)。 public class ReferenceDemo {public static void main(String[] args) {MyObject myObject new MyObject();System.out.println(gc before: myObject);myObject null;//手动触发一次GCSystem.gc();System.out.println(gc after: myObject);} }调用finalize方法是另一线程这里的打印顺序不用关注。 3、软引用 软引用是一种相对强引用弱化了一些的引用需要用java.lang.ref.SoftReference类来实现可以让对象豁免一些垃圾收集。 总之就是相对强引用而言稍微松一点GC触发时 当系统内存充足时它不会被回收当系统内存不足时它会被回收 软引用通常用在对内存敏感的程序中比如高速缓存就有用到软引用内存够用的时候就保留不够用就回收。用SoftReference把自定义对象包装一下对应的引用就变成了软引用。 SoftReferenceMyObject softReference new SoftReference(new MyObject()); System.out.println(gc before: softReference.get()); //手动触发一次GC System.gc(); System.out.println(gc after: softReference.get()); 修改Demo类的JVM内存限制创造一个内存不足的情况 创建一个20M的数组超过了上面的最大内存模拟内存不足对象被回收 4、弱引用 对于只有弱引用的对象来说只要垃圾回收机制一运行不管JVM的内存空间是否足够都会回收该对象占用的内存。 WeakReferenceMyObject weakReference new WeakReference(new MyObject()); System.out.println(gc before: weakReference.get()); System.gc(); System.out.println(gc after: weakReference.get());软引用和弱引用的适用场景举例 假如有一个应用需要读取大量的本地图片如果每次读取图片都从硬盘读取则会严重影响性能如果一次性全部加载到内存中又可能造成内存溢出此时使用软引用可以解决这个问题。 设计思路是 用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系在内存不足时JVM会自动回收这些缓存图片对象所占用的空间从而有效地避免了OOM的问题。 MapString, SoftReferenceBitmap imageCache new HashMapString, SoftReferenceBitmap().5、虚引用 1虚引用必须和引用队列ReferenceQueue联合使用 虚引用需要java.lang.ref.PhantomReference类来实现虚即形同虚设虚引用不会决定对象的生命周期如果一个对象仅持有虚引用则它和没任何引用一样随时都可能被垃圾回收器回收不能单独使用也不能通过它访问对象虚引用必须和引用队列ReferenceQueue联合使用如果虚引用对象被干掉了就装到队列里 2PhantomReference虚引用的get方法总是返回null 虚引用的主要作用是跟踪对象被垃圾回收的状态仅仅是提供了一种确保对象被 finalize以后做某些事情的通知机制PhantomReference的get方法总是返回null因此无法访问对应的引用对象 3处理监控通知使用 设置虚引用关联对象的唯一目的就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理用来实现比finalize机制更灵活的回收操作 构造方法 //传入要包装的对象和引用队列 PhantomReference(T referent ReferenCeQueue? super T queue)继续设置JVM最大内存10M public class ReferenceDemo {public static void main(String[] args) {MyObject myObject new MyObject();ReferenceQueueMyObject referenceQueue new ReferenceQueue();PhantomReferenceMyObject phantomReference new PhantomReference(myObject, referenceQueue);Listbyte[] list new ArrayList();new Thread(() - {while (true){list.add(new byte[1024 * 1024]); //1M//歇500ms写1M进Listtry {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}//验证下每次get都是nullSystem.out.println(phantomReference.get() list add OK.);}},t1).start();new Thread(() - {while (true){Reference? extends MyObject reference referenceQueue.poll();if(reference ! null){System.out.println(有虚引用对象被回收加入了队列);//break;}}},t2).start();}}开一个线程去占用内存另开一个线程去查看队列可以看到中途虚引用对应的对象被回收时会加入到队列中。 6、ThreadLocal回顾 ThreadLocal是一个壳子真正的存储结构是ThreadLocal里的ThreadLocalMap这个内部类每个Thread对象维护着ThreadLocalMap的引用ThreadLocalMap则用Entry来进行存储。 调用ThreadLocal的set方法时实际上就是往ThreadLocalMap设置值key是ThreadLoca对象值Value是传递进来的对象调用ThreadLocal的get方法时实际上就是往ThreadLocalMap获取值key是ThreadLocal对象 ThreadLocal本身并不存储值(ThreadLocal是一个壳)它只是自己作为一个key来让线程从ThreadLocalMap获取value。正因为这个原理所以ThreadLocal能够实现线程间的数据隔离获取当前线程的局部变量值不受其他线程影响 7、ThreadLocal使用弱引用的原因 public void function01(){//新建一个ThreadLocal对象t1是强引用指向这个对象ThreadLocalString t1 new ThreadLocal();//实际是创建了一个Entry对象根据Entry源码知Entry对象里的key即ThreadLocal是弱引用指向这个对象//当一个ThreadLocal实例对象只被Entry类实例或者其它弱引用实例引用时它就会被GC回收t1.set(code9527);t1.get(); }当function1方法执行完毕后栈帧销毁强引用 t1 也就没有了。但此时线程的ThreadLocalMap里某个entry的key引用还指向这个对象。此时 若这个key引用是强引用就会导致key指向的ThreadLocal对象以及v指向的对象不能被gc回收造成内存泄漏 若这个key引用是弱引用就大概率会减少内存泄漏的问题(还有一个key为nul的雷在下面再展开)。 使用弱引用就可以使ThreadLocal对象在方法执行完毕后顺利被回收且Entry的key引用指向为null而此后我们调用get、set、remove方法时就会尝试删除key为null的entry可以释放value对象所占用的内存。 8、清除脏Entry 当我们为threadLocal变量赋值实际上就是当前EntrythreadLocal实例为key值为value往这个threadLocalMap中存放。Entry中的key是弱引用当threadLocal外部强引用被置为null比如前面例子的t1null那么系统 GC 的时候根据可达性分析这个threadLocal实例就没有任何一条路能够引用到它 这个ThreadLocal势必会被回收。 这样一来ThreadLocalMap中就会出现key为nul的Entry就没有办法访问这些key为nul的Entry的value如果当前线程再迟迟不结束的话线程池线程在不断复用这些key为null的Entry的value就会一直存在一条强引用某个线程池中线程T1的引用Thread Ref ⇒ Thread ⇒ ThreadLocalMap ⇒ Entry ⇒ value 因此永远无法回收最后造成内存泄漏。 当然如果当前thread运行结束threadLocal、threadLocalMap、Entry没有引用链可达在垃圾回收的时候都会被系统进行回收。 关于以上key为null的脏Entry的清除 expungeStaleEntry方法其中get、set、remove等方法源码中都有调用expungeStaleEntry方法如get -- 调getEntry方法 -- getEntryAfterMiss方法 虽然弱引用保证了key指向的ThredLocal对象能被及时回收但是v指向的value对象是需要ThreadLocalMap调用get、set时发现key为nul时才会去回收整个entry、value因此弱引用不能100%保证内存不泄露我们要在不使用某个ThreadLocal对象后手动调用remoev方法来删除它尤其是在线程池中不仅仅是内存泄露的问题因为线程池中的线程是重复使用的意味着这个线程的ThreadLocalMap对象也是重复使用的如果我们不手动调用remove方法那么后面的线程就有可能获取到上个线程遗留下来的value值造成bug。 总结 弱引用保证ThreadLocal对象被及时回收key为null的Entry会累积get、set时检查所有键为null的Entry对象并删除 9、最佳实践 【建议】创建ThreadLocal对象采用静态方法ThreadLocal.withInitial(() - 初始值)【建议】把ThreadLocal修饰为static若某个属性所有对象都相同则用静态变量存方法区如国籍这样只在方法区保存一份可避免不必要的内存空间浪费反之则是实例变量【强制】用完手动remove 最后对ThreadLocal的总结 ThreadLocal 并不解决线程间共享数据的问题ThreadLocal 适用于变量在线程间隔离且在方法间共享的场景ThreadLocal 通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题每个线程持有一个只属于自己的专属Map并维护了ThreadLocal对象与具体实例的映射该Map由于只被持有它的线程访问故不存在线程安全以及锁的问题ThreadLocalMap的Entry对ThreadLocal的引用为弱引用避免了ThreadLocal对象无法被回收的问题都会通过expungeStaleEntry、cleanSomeSlots、replaceStaleEntry这三个方法回收键为 null 的 Entry对象的值 以及 Entry 对象本身从而防止内存泄漏属于安全加固的方法群雄逐鹿起纷争人各一份天下安
http://www.zqtcl.cn/news/182087/

相关文章:

  • 做国际黄金看什么网站网络营销品牌推广公司
  • 手机自助建站平台手机网站开发设计报价单
  • 网站建设标书范本注册了一个域名怎么做网站
  • 行政部建设公司网站东莞市做网站
  • 网站建设开发的流程建设官方网站的主要作用
  • 怎样用模板做网站wordpress柚子皮
  • 长宁区网站建设公司内蒙古赤峰市建设局网站
  • 网站配色怎么对网站的数据库做管理
  • 企业网站效果图wap网站
  • 网站建设优化托管跨境电商怎么做流程
  • 昆明网站建站平台在线阅读网站开发教程
  • pv3d 优秀网站18种最有效推广的方式
  • 一站式网站建设顾问网站建设公司专业网站科技开发
  • python做网站比php好网站开发财务费用
  • 图片上传网站变形的处理北京网站建设有哪些公司
  • 昆山品牌网站建设wordpress 浮动二维码
  • 网站网页建设论文cms免费源码
  • wordpress登录的图片不显示seo竞价网站建设
  • 邢台做移动网站找谁网上推广平台哪个好
  • 做网站准备广州短视频拍摄公司
  • 网站建设学什么软件做电影资源网站有哪些
  • 怎么样让百度搜到自己的网站wordpress的短代码
  • 聊城专业网站建设公司电子商务网站建设与维护李建忠下载
  • icp备案网站接入信息怎么写长兴县网站建设
  • 如何在网上注册公司网站网站不想让百度收录
  • 服务器做jsp网站教程视频免费的舆情网站app下载
  • 肇庆网站建设方案优化家居定制类网站建设
  • 自助建站加盟备案的网站有什么好处
  • 科技公司企业网站建设重庆seo优化
  • 空间站天宫vr全景尚层装饰