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

哈尔滨做网站哪家好网站优化服务合同

哈尔滨做网站哪家好,网站优化服务合同,建设网站注意哪几点,金湖网站推广这节我们主要讲垃圾收集的一些基本概念#xff0c;先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。一、前言我们都知道Java和C有一个非常大的区别就是Java有自动的垃圾回收机制#xff0c;经过半个多世纪的发展#xff0c;Java已经进入了“自动…这节我们主要讲垃圾收集的一些基本概念先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。一、前言我们都知道Java和C有一个非常大的区别就是Java有自动的垃圾回收机制经过半个多世纪的发展Java已经进入了“自动化”时代让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么还要学习Java的垃圾回收机制呢原因很简单我们不想止于“增删改查工程师”这样的初级水平一旦程序发生了内存溢出、内存泄漏等问题时我们可以用已掌握的知识更好的调节和优化我们的代码。在学这章节之前默认大家已经了解并掌握了Java内存运行时的五个区域的功能方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。还没有了解过的朋友请先看这里JVM中五大内存区域二、判断对象是否死亡客官们可以先想一下GC垃圾回收机制在清理内存的时候第一件事要做什么肯定是要先判断内存中的对象是否已经死亡也就是再也不会被使用了然后才会去回收这些对象。判断对象是否死亡通常会有两种办法 引用计数法 和 可达性分析 。 引用计数法使用引用计数法要先给每一个对象中添加一个计数器一旦有地方引用了此对象则该对象的计数器加1如果引用失效了则计数器减1。这样当计数器为0时就代表此对象没有被任何地方引用。这种方法实现简单判定效率也很高在大部分情况下都是一个比较不错的方法。但是在Java虚拟机中并没有选用引用计数法来管理内存其主要原因是它很难解决对象之间相互引用的问题如果两个对应互相引用导致他们的引用计数都不为0最终不能回收他们。我们来举个例子class Person{public Person lover null;//定义一个爱人private String name ;//姓名Person(String name){this.name name;} } public class Demo {public static void main(String[] args) {Person liangshanbo new Person(梁山伯);//创建一个人物梁山伯Person zhuyingtai new Person(祝英台);//创建一个人物祝英台liangshanbo.lover zhuyingtai;//设置梁山伯的爱人是祝英台zhuyingtai.lover liangshanbo;//设置祝英台的爱人是梁山伯} }其中梁山伯和祝英台两个对象互相引用因此如果使用引用计数法来判断对象是否死亡的话垃圾回收机制是不能回收这两个对象的。可达性分析算法在大部分主流语言中都是通过此方法来判断对象是否存活的这个算法的思想是通过一系列被称为“GC root”的对象作为起始点从这些节点开始向下搜索走过的路径叫做引用链。如果一个对象没有通过引用链连接到GC root节点则证明此对象是不可用的如下图所示GC roots 是根节点凡是能通过引用链连接上GC root 的Object 1,2,3,4都是被使用的对象。但是Object 5,6,7却不能通过任何方式连接上根节点因此判定Object 5,6,7为可回收的节点。理解了可达性分析法你可能又会问了GC root对象是什么在JAVA语言中可以作为GC root的对象包括以下几种虚拟机栈栈帧中的本地变量表中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNIJava Native Interface引用的对象。以上四种不需要死记硬背由于方法区、虚拟机栈和本地方法栈中保存了类中和方法中定义的变量的引用既然是自己定义的变量所以肯定是有用的。“引用”是什么我们知道java中将数据类型分为两大类基本类型和引用类型。java中引用的定义是如果reference类型的数据中存储的数值代表的是另一块内存的起始地址就称这块内存代表着一个引用。举个例子Person p new Person();上面代码的写法我们经常见到其中等号后面的 new Person(); 是真正的对象所有的内容都保存在java堆内存中而等号前面的 p 只是真实内容的一个代称保存在虚拟机栈内存中它存储的只是一个地址是 new Person(); 在堆内存中的起始位置因此 p 就是一个引用。按照这种理解java的对象只能够分为被引用和没有被引用两种情况。但是在JDK1.2之后java对引用的概念进行了扩充分为强、软、弱、虚四种引用且强度依次逐渐降低。强引用即咱们经常看到的引用方式如在方法中定义Object obj new Object();真正的对象“new Object()”保存在java堆中其中“obj”代表了一个引用存放的是java堆中“new Object()”的起始地址。只要引用还在垃圾收集器就不会回收掉被引用的对象。软引用是用来描述一些有用但非必须的对象我们可以使用SoftReference类来实现软引用。对于软引用关联着的对象在系统将要发生内存溢出异常之前会把这些对象列进回收范围之中。如果回收之后内存还是不足才会报内存溢出的异常。弱引用是用来描述非必须的对象使用WeakReference类来实现弱引用。它只能生存到下一次垃圾回收发生之前当垃圾回收机制开始时无论是否会内存溢出都将回收掉被弱引用关联的对象。虚引用最没有存在感的一种引用关系可以通过PhantomReference类来实现。存在不存在几乎没影响也不能通过虚引用来获取一个对象实例存在的唯一目的是被垃圾收集器回收后可以收到一条系统通知。我们可以通过代码来控制对象的“强软弱虚”四种引用有利于JVM进行垃圾回收。那么知道了上面的知识后我们来探究一下对象是否会死亡 对象是否死亡之前提到过通过可达性分析后找到的不可达对象会被垃圾收集器回收那么不可达对象一定会被回收吗答案是不一定。这时候他们处于“死缓”的阶段如果非要“上诉”也是有可能被无罪释放的。他们是如何自救的在可达性分析后发现一些对象没有跟GC root相连接的引用链该对象会被进行一次标记然后进行筛选筛选的条件是判断该对象有没有必要执行finalize()方法此方法每个对象默认都有但如果对象没有重写finalize()方法或者对象的finalize方法已经被虚拟机调用过一次了则都将视为“没有必要执行”垃圾回收器可以直接回收。此段是自我拯救的过程不是重点了解即可如果该对象被判定有必要执行finalize()方法那么虚拟机会把这个对象放置在一个F-Queue的队列中然后由一个专门的Finalizer线程去执行这个对象的finalize()方法。我们可以在这个方法中进行对象的“自我拯救”即重新与引用链上的任何一个对象建立关联就可以了比如把this赋值给某个类的变量或者对象的成员变量那么在第二次标记时它将被移除“即将回收”的集合下面我们看一个案例来了解。/*** author 编程开发分享者* Date 2020/3/16 10:51*/ public class FinalizeEscapeGC {/*** 知识点回顾* 1.方法区中存放的是类的基本信息、静态变量、编译后的代码、常量池* 2.GC root可以是方法区中静态变量引用的对象* 3.一个对象的finalize()方法最多只会被系统自动调用一次。* *///创建一个静态变量public static FinalizeEscapeGC SAVE_HOOK null;Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println(程序执行了finalize()方法);SAVE_HOOK this;//将自己赋值给一个静态变量实现自我拯救连接上了GC root细品知识点回顾}public static void main(String[] args) throws InterruptedException {SAVE_HOOK new FinalizeEscapeGC();//第一次准备杀死对象SAVE_HOOK null;//将对象置空按理说会被GC回收但此对象实现了finalize()方法并实现了自我拯救System.gc();//执行GCThread.sleep(500);//由于Finalizer线程优先级比较低因此短暂休眠主线程等等它if (SAVE_HOOK!null){System.out.println(哈哈哈我还活着);}else {System.out.println(No,我哏儿屁了);}System.out.println(--------------------------);//第二次准备杀死对象跟上面代码一样SAVE_HOOK null;//将对象置空此时finalize()方法已经自动执行过一次了System.gc();//执行GCThread.sleep(500);//由于Finalizer线程优先级比较低因此短暂休眠主线程等等它if (SAVE_HOOK!null){System.out.println(哈哈哈我还活着);}else {System.out.println(No,我哏儿屁了);}}}运行结果注意根据《深入理解Java虚拟机》中解释这种自我拯救的方法运行代价高昂不确定性大无法保证各个对象的调用顺序因此这一知识点仅作了解即可。回收方法区由于我们经常用的HotSpot虚拟机规定方法区也可以称为永久代因此很多人认为在方法区中是没有垃圾收集的其实是有的只不过收集垃圾的“性价比”非常低。在堆中尤其是新生代垃圾收集一般可以回收70%~95%的空间而永久代的垃圾收集效率远低于此。永久代的垃圾收集主要回收两部分内容废弃常量和无用的类。回收废弃常量当前系统中没有任何对象引用常量池中的某个常量则一旦发生内存回收如果有必要该常量就会被系统清理出常量池。回收无用的类要满足三个条件才能证明某个类是无用的1.类的实例都已经被回收了。2.加载该类的ClassLoader也被回收了。3.该类对应的java.lang.Class对象没有在任何地方被引用。注意满足以上三点的类只是说可以被回收但并不像对象一样一定会被回收是否进行回收可以使用虚拟机提供的参数来控制。大量使用反射、动态代理等频繁自定义ClassLoader的场景都需要虚拟机具备类卸载功能以保证永久代不会溢出
http://www.sadfv.cn/news/76713/

相关文章:

  • 网站搭建dns有用吗织梦后台怎么做网站地图
  • 做数据的网站内蒙古建设 招聘信息网站
  • 有哪些做微信小游戏的网站视频号怎么运营
  • 北京网站制作网站汕头怎么进行关键词优化
  • 敦煌网外贸平台搜索引擎优化的步骤
  • 北京网站优化培训建网站找兴田德润
  • 网站做后台网站的费用多少
  • 网站源码下载哪个网站好网页设计与制作课程性质
  • 全国建造师查询网站做网站要注意什么问题
  • 网站做网站词怎么推广朝阳网站优化
  • 佳木斯 两学一做 网站wordpress 评论 邮件
  • 在国外做黄皮网站违法么企业管理培训课程安排
  • 网站建设应用程序开发数据可视化网站模板
  • 谷歌seo网站推广怎么做优化付费问答 WordPress
  • 江门市建设工程投标网站郑州西区做网站
  • 南昌网站设计怎么选企业名录搜索软件免费
  • 什么网站能找到做展览的工人做哪种网站流量上的快
  • 学会wordpress建站厦门成交型网站建设公司
  • wordpress可以做淘宝网站建设优化解析
  • 阿里巴巴网站建设分析做网站的用什么软件呢
  • 公司网站建设管理制度网站申请微信支付接口
  • 上传网站安装教程视频wordpress大前端主题怎么样
  • 教育网站开发方案一个人0资金怎么创业
  • 网站设计模板网站静态单页网站wordpress
  • 个人网站的设计和建设男做基视频网站
  • 西宁建设公司网站潍坊网站建设8年
  • 建立网站怎么搞做套现网站
  • 手机版网站模板 免费下载劳务派遣许可证
  • 电商网站建设在哪里找设计师兰州市城市建设设计院
  • 如何写作网站网站建设方案书阿里云模板