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

海南省建设集团有限公司网站吉林企业网络推广方法

海南省建设集团有限公司网站,吉林企业网络推广方法,电子商务网站建设与运营方向,郑州平台类网站内存泄漏与内存溢出 JVM在运行时会存在大量的对象#xff0c;一部分对象是长久使用的#xff0c;一部分对象只会短暂使用 JVM会通过可达性分析算法和一些条件判断对象是否再使用#xff0c;当对象不再使用时#xff0c;通过GC将这些对象进行回收#xff0c;避免资源被用…内存泄漏与内存溢出 JVM在运行时会存在大量的对象一部分对象是长久使用的一部分对象只会短暂使用 JVM会通过可达性分析算法和一些条件判断对象是否再使用当对象不再使用时通过GC将这些对象进行回收避免资源被用尽 内存泄漏当不再需要使用的对象因为不正确使用时可能导致GC无法回收这些对象 当不正确的使用导致对象生命周期变成也是宽泛意义上的内存泄漏 内存溢出当大量内存泄漏时可能没有资源为新对象分配 举例内存泄漏 接下来将从对象生命周期变长、不关闭资源、改变对象哈希值、缓存等多个场景举例内存泄漏 对象生命周期变长引发内存泄漏 静态集合类 public class StaticClass {private static final ListObject list new ArrayList();/*** 尽管这个局部变量Object生命周期非常短* 但是它被生命周期非常长的静态列表引用* 所以不会被GC回收 发生内存溢出*/public void addObject(){Object o new Object();list.add(o);} } 类卸载的条件非常苛刻这个静态列表生命周期基本与JVM一样长 静态集合引用局部对象使得局部对象生命周期变长发生内存泄漏 饿汉式单例模式 public class Singleton {private static final Singleton INSTANCE new Singleton();private Singleton(){if (INSTANCE!null){throw new RuntimeException(not create instance);}}public static Singleton getInstance(){return INSTANCE;} } 饿汉式的单例模式也是被静态变量引用即时不需要使用这个单例对象GC也不会回收 非静态内部类 非静态内部类会有一个指针指向外部类 public class InnerClassTest {class InnerClass {}public InnerClass getInnerInstance() {return this.new InnerClass();}public static void main(String[] args) {InnerClass innerInstance null;{InnerClassTest innerClassTest new InnerClassTest();innerInstance innerClassTest.getInnerInstance();System.out.println(外部实例对象内存布局);System.out.println(ClassLayout.parseInstance(innerClassTest).toPrintable());System.out.println(内部实例对象内存布局);System.out.println(ClassLayout.parseInstance(innerInstance).toPrintable());}//省略很多代码.....} } 当调用外部类实例方法通过外部实例对象返回一个内部实例对象时调用代码中的getInnerInstance方法 外部实例对象不需要使用了但内部实例对象被长期使用会导致这个外部实例对象生命周期变长 因为内部实例对象隐藏了一个指针指向引用创建它的外部实例对象 实例变量作用域不合理 如果只需要一个变量作为局部变量在方法结束就不使用它了但是把他设置为实例变量此时如果该类的实例对象生命周期很长也会导致该变量无法回收发生内存泄漏因为实例对象引用了它 变量作用域设置的不合理会导致内存泄漏 隐式内存泄漏 动态数组ArrayList中remove操作会改变size的同时将删除位置置空从而不再引用元素避免内存泄漏 不置空要删除的元素对数组的添加删除查询等操作毫无影响看起来是正常的只是会带来隐式内存泄漏 不关闭资源引发内存泄漏 各种连接: 数据库连接、网络连接、IO连接在使用后忘记关闭GC无法回收它们会发生内存泄漏 所以使用连接时要使用 try-with-resource 自动关闭连接 改变对象哈希值引发内存泄漏 一般认为对象逻辑相等只要对象关键域相等即可 一个对象加入到散列表是通过计算该对象的哈希值通过哈希算法得到放入到散列表哪个索引中 如果将对象存入散列表后修改了该对象的关键域就会改变对象哈希值导致后续要在散列表中删除该对象会找错索引从而找不到该对象导致删除失败极小概率找得到 public class HashCodeTest {/*** 假设该对象实例变量a,d是关键域* a,d分别相等的对象逻辑相等*/private int a;private double d;Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;HashCodeTest that (HashCodeTest) o;return a that.a Double.compare(that.d, d) 0;}Overridepublic int hashCode() {return Objects.hash(a, d);}public HashCodeTest(int a, double d) {this.a a;this.d d;}public HashCodeTest() {}Overridepublic String toString() {return HashCodeTest{ a a , d d };}public static void main(String[] args) {HashMapHashCodeTest, Integer map new HashMap();HashCodeTest h1 new HashCodeTest(1, 1.5);map.put(h1, 100);map.put(new HashCodeTest(2, 2.5), 200);//修改关键域 导致改变哈希值h1.a100;System.out.println(map.remove(h1));//nullSetMap.EntryHashCodeTest, Integer entrySet map.entrySet();for (Map.EntryHashCodeTest, Integer entry : entrySet) {System.out.println(entry);}//HashCodeTest{a100, d1.5}100//HashCodeTest{a2, d2.5}200} } 所以说对象当作Key存入散列表时该对象最好是逻辑不可变对象不能在外界改变它的关键域从而无法改变哈希值 将关键域设置为final只能在实例代码块中初始化或构造器中 如果关键域是引用类型可以用final修饰后对外不提供改变该引用关键域的方法从而让外界无法修改引用关键域中的值 如同String类型所以String常常用来当作散列表的Key 缓存引发内存泄漏 当缓存充当散列表的Key时如果不再使用该缓存就要手动在散列表中删除否则会发生内存泄漏 如果使用的是WeakHashMap它内部的Entry是弱引用当它的Key不再使用时下次垃圾回收就会回收掉不会发生内存泄漏 public class CacheTest {private static MapString, String weakHashMap new WeakHashMap();private static MapString, String map new HashMap();public static void main(String[] args) {//模拟要缓存的对象String s1 new String(O1);String s2 new String(O2);weakHashMap.put(s1,S1);map.put(s2,S2);//模拟不再使用缓存s1null;s2null;//垃圾回收WeakHashMap中存的弱引用System.gc();try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}//遍历各个散列表System.out.println(HashMap);traverseMaps(map);System.out.println();System.out.println(WeakHashMap);traverseMaps(weakHashMap);}private static void traverseMaps(MapString, String map){for (Map.EntryString, String entry : map.entrySet()) {System.out.println(entry);}} } 结果 注意: 监听器和回调 也应该像这样成为弱引用 总结 这篇文章介绍内存泄漏与内存溢出的区别并从生命周期变长、不关闭资源、改变哈希值、缓存等多方面举例内存泄漏的场景 内存泄漏是指当对象不再使用但是GC无法回收该对象 内存溢出是指当大量对象内存泄漏没有资源再给新对象分配 静态集合、饿汉单例、不合理的设置变量作用域都会使对象生命周期变长从而导致内存泄漏 非静态内部对象有隐式指向外部对象的指针、使用集合不删除元素等都会隐式导致内存泄漏 忘记关闭资源导致内存泄漏try-with-resource自动关闭解决 使用散列表时充当Key 对象的哈希值被改变导致内存泄漏key 使用逻辑不可变对象关键域不能被修改 缓存引发内存泄漏使用弱引用解决 最后一键三连求求拉~ 本篇文章将被收入JVM专栏觉得不错感兴趣的同学可以收藏专栏哟~ 本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~ 有什么问题可以在评论区交流如果觉得菜菜写的不错可以点赞、关注、收藏支持一下~ 关注菜菜分享更多干货公众号菜菜的后端私房菜 本文由博客一文多发平台 OpenWrite 发布
http://www.dnsts.com.cn/news/63634.html

相关文章:

  • 地和网站建设在线制作logo图片
  • 网站备案需要准备什么点评类网站建设
  • 可视化拖拽网站建设软件承德市宽城县建设局网站
  • 中国沙漠建设 志愿者 兵团官方网站wordpress 503
  • 比较好的网站开发项目wordpress 获取根目录
  • 网站建设的专业术语网站群系统
  • 北京代理网站备案泊美网站建设总目的
  • 学校后勤部网站建设方案怀化建设局网站
  • 建筑工程网站哪个好论坛如何做seo
  • 织梦html5手机网站模板深圳网站建设开发哪家好
  • 山石网站超市南通专业网站制作
  • 现代农业园网站建设方案四川做网站
  • 比较好的网站建设品牌设计wordpress链接 数据库文件
  • 浅谈做网站的好处东莞百姓网交友
  • 安康手机网站建设自己做签名网站
  • 旅游网站设计与实现论文wordpress statraq
  • 两学一做网站网站群晖搭建wordpress固定链接
  • 深圳网站制作首荐祥奔科技我对网站开发的项目反思
  • 中国建设银行贵州省分行网站wordpress模板图片不显示
  • 计算机多媒体辅助教学网站开发商城源码购买
  • 广东网站设计专业团队给实体店老板做的网站
  • 超链接到网站怎么做视频文件品牌网站建设解决方
  • 网站建设实习免费做计算机题的网站
  • 图片素材网站排行榜个人代做网站
  • 网站建设工作室深圳百度指数查询官网入口
  • 网站搬家闵行网站建站多少钿
  • 凯里网站建设如何收费网站开发和软件开发含义
  • 沭阳做网站的公司网站权重是什么
  • app设计网站模板免费下载wordpress导出主题
  • 网络公司做网站的合同wordpress主题消失