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

开发区网站建设公司wordpress中文官网

开发区网站建设公司,wordpress中文官网,个人博客html,软件开发工程师的发展前景一.什么是垃圾回收#xff1f; 垃圾回收主要针对堆和方法区#xff08;非堆#xff09;,程序计数器#xff0c;虚拟机栈#xff0c;本地方法栈这三个区域属于线程私有#xff0c;随着线程的销毁#xff0c;自然就会雄安会了#xff0c;因此不需要堆着三个区域进行垃圾…一.什么是垃圾回收 垃圾回收主要针对堆和方法区非堆,程序计数器虚拟机栈本地方法栈这三个区域属于线程私有随着线程的销毁自然就会雄安会了因此不需要堆着三个区域进行垃圾回收。 二.如何判断一个对象是否可以被回收 堆中几乎放着所有的对象实例为什么这么说呢因为现在有了JIT和标量替换等优化方法对对垃圾回收前的第一步就是判断哪些对象已经死亡即不能再被任何途径使用的对象。 引用计数算法 为对象添加一个引用计数器当对象增加一个引用计数器就加一引用失效就减一引用计数为0的对象可被回收在两个对象出现循环引用的情况下此时引用计数器永远不会为0导致无法对他们及逆行回收就是因为有循环引用的存在因此java虚拟机不使用引用计数算法。 public class Test {public Object instance null;public static void main(String[] args) {Test a new Test();Test b new Test();a.instance b;b.instance a;a null;b null;doSomething();} } 上面的例子中a,b引用对象示例互相持有了对象的引用因此当我们把对a对象和b对象的引用去除之后由于两个对象还存在互相引用导致两个Test对象无法被回收 优点 执行效率高缺点无法解决循环引用引起内存泄漏 可达性分析算法 通过判断对象的引用链是否可达来决定对象是否可以被回收 以GC roots 为起始点进行搜索可达的对象都是存货的不可达的对象可被回收 Java 虚拟机使用可达性分析算法来判断对象是否可被回收GC Roots 一般包含以下几种 虚拟机栈中局部变量表中引用的对象栈帧中的本地方法变量表 本地方法栈中 JNINative方法 中引用的对象 方法区中类静态属性引用的对象 方法区中的常量引用的对象 活跃线程的引用对象 方法区的回收 因为方法区主要存放永久代对象而永久代对象的回收率比新生代低很多所以在方法区上进行回收性价比不高 主要对常量池的回收和对类的卸载 为了避免内存溢出在大量使用反射和动态代理的场景都需要虚拟机具备类卸载功能。 类卸载条件很多需要满足以下三个条件此时堆中不存在该类的任何示例。加载该类的ClassLoader已经被回收该类对应的Class对象没有任何地方引用了也就是无法在任何地方通过反射访问该类的方法 finalize()  用于关闭外部资源。但是 try-finally 等方式可以做得更好并且该方法运行代价很高不确定性大无法保证各个对象的调用顺序因此最好不要使用。 当垃圾回收器宣告一个对象死亡时至少要经理两次标记过程 如果对象在进行可达性分析以后没有与GC root 直接相连接的引用就会被第一次标记。并且判断是否执行finalize方法 如果这个对象覆盖了finalize() 并且未被引用就会放置F-Queue对象稍后由虚拟机创建一个低优先级的finalize()线程去执行触发finalize()方法在该方法中让对象重新被引用从而实现自救但是该线程的优先级比较低执行过程随时可能被终止此外自救只能进行一次如果回收的对象之前调用了 finalize() 方法自救后面回收时不会再调用该方法。 强引用 被强引用关联的对象不会被回收。 使用 new 一个新对象的方式来创建强引用。 当内存空间不足JVM 抛出 OOM Error 终止程序也不会回收具有强引用的对象只有通过将对象设置为 null 来弱化引用才能使其被回收。 软引用 表示对象处在有用但非必须的状态。 被软引用关联的对象只有在内存不够的情况下才会被回收。可以用来实现内存敏感的高速缓存。 软引用可以和一个引用队列 ReferenceQueue 联合使用如果软引用所引用的对象被垃圾回收JVM 就会把这个软引用加入到与之关联的引用队列中。如果一个弱引用对象本身在引用队列中就说明该引用对象所指向的对象被回收了。 使用 SoftReference 类来创建软引用。 弱引用 表示非必须的对象比软引用更弱一些。适用于偶尔被使用且不影响垃圾收集的对象。 被弱引用关联的对象一定会被回收也就是说它只能存活到下一次垃圾回收发生之前。 弱引用可以和一个引用队列 ReferenceQueue 联合使用如果弱引用所引用的对象被垃圾回收JVM 就会把这个弱引用加入到与之关联的引用队列中。如果一个弱引用对象本身在引用队列中就说明该引用对象所指向的对象被回收了。 使用 WeakReference 类来创建弱引用。 虚引用 又称为幽灵引用或者幻影引用一个对象是否有虚引用的存在不会对其生存时间造成影响也无法通过虚引用得到一个对象。 不会决定对象的生命周期任何时候都可能被垃圾回收器回收。必须和引用队列 ReferenceQueue 联合使用。 为一个对象设置虚引用的唯一目的是能在这个对象被回收时收到一个系统通知起哨兵作用。具体来说就是通过判断引用队列 ReferenceQueue 是否加入虚引用来判断被引用对象是否被 GC垃圾回收线程 回收当 GC 准备回收一个对象时如果发现它还仅有虚引用指向它就会在回收该对象之前把这个虚引用加入到与之关联的引用队列 ReferenceQueue 中。如果一个虚引用对象本身就在引用队列中就说明该引用对象所指向的对象被回收了。 使用 PhantomReference 来创建虚引用。 引用类型被垃圾回收的时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时终止软引用在内存不足的时候对象缓存内存不足时终止弱引用在垃圾回收的时候对象缓存GC运行后终止虚引用Unknown标记、哨兵Unknown 垃圾回收算法 1.标记清除算法 标记阶段从根集合进行扫描会检查每个对象是否为活动对象如果是活动对象则程序会在对象头打上标记 清除阶段会进行对象回收并取消标志位另外还会帕努但回收后的分块与前一个空闲分块是否连续如果连续会合并这两个分块回收对象就是把对象作为分块连接到被称为空闲链表的单向链表之后进行分配时只需要遍历这个空闲链表就可以找到分块。 分配阶段程序会搜索空闲链表寻找空间大于等于新对象大小size的块block如果它找到的块等于size 会直接返回这个分块如果找到大于size,就会对块分割成大小为size 与block-size的两部分返回大小为size的分块并把大小为(block - size) 的块返回给空闲链表。 不足 标记和清除过程效率都不高 会产生大量不连续的内存碎片导致无法给大对象分配内存。 2.标记整理算法 ‘  标记过程仍然与“标记-清除”算法一样但后续步骤不是直接对可回收对象回收而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存。 优点不会产生内存碎片 不足需要移动大量对象处理效率比较低。 复制算法 将内存划分为大小相等的两块每次只使用其中一块当这一块内存用完了就将还存活的对象复制到另一块上面然后再把使用过的内存空间进行一次清理。 主要不足是只使用了内存的一半。 现在的商业虚拟机都采用这种收集算法回收新生代但是并不是划分为大小相等的两块而是一块较大的 Eden 空间和两块较小的 Survivor 空间每次使用 Eden 和其中一块 Survivor。在回收时将 Eden 和 Survivor 中还存活着的对象全部复制到另一块 Survivor 上最后清理 Eden 和使用过的那一块 Survivor。 HotSpot 虚拟机的 Eden 和 Survivor 大小比例默认为 8:1保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活那么一块 Survivor 就不够用了此时需要依赖于老年代进行空间分配担保也就是借用老年代的空间存储放不下的对象 分代收集 现在的商业虚拟机采用分代收集算法它根据对象存活周期将内存划分为几块不同块采用适当的收集算法。 一般将堆分为新生代和老年代这样我们就可以根据各个年代的特点选择合适的垃圾收集算法 新生代新生代对象存活时间很短所以可以选择“复制”算法只需要付出少量对象的复制成本就可以完成每次垃圾收集。 老年代老年代的对象存活几率是比较高的而且没有额外的空间对它进行分配担保所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。 Stop-the-World SafePoint Stop-the-World 所谓 Stop-the-World简称 STW指的是 JVM 由于要执行 GC 而停止了应用程序的执行  可达性分析算法中 GC Roots 会导致所有 Java 执行线程停顿原因如下 分析工作必须在一一个能确保一致性的快照中进行 一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上 如果出现分析过程中对象引用关系还在不断变化则分析结果的准确性无法保证 被 STW 中断的应用程序线程会在完成 GC 之后恢复频繁中断会让用户感觉像是网速不快造成电影卡带一样 影响用户体验所以需要减少 STW 的发生。 STW 事件和采用哪款垃圾收集器无关所有的 GC 都有这个事件。哪怕是 G1 也不能完全避免 STW 情况发生只能说垃圾回收器越来越优秀回收效率越来越高尽可能地缩短了暂停时间。 STW 是 JVM 在后台自动发起和自动完成的。在用户不可见的情况下把用户正常的工作线程全部停掉。开发中不要用 System.gc()  这样会导致 STW 的发生。 目前降低系统的停顿时间两种算法增量收集算法和分区算法。 增量收集算法 基本思想如果一次性将所有的垃圾进行处理需要造成系统长时间的停顿那么就可以让垃圾收集线程和应用程序线程交替执行。垃圾收集线程一次只收集一小片区域的内存空间接着切换到应用程序线程。依次反复直到垃圾收集完成。总的来说增量收集算法的基础仍是传统的标记-清除和复制算法。增量收集算法通过对线程间冲突的妥善处理允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作。 不足由于在垃圾回收过程中间断性地还执行了应用程序代码所以能减少系统的停顿时间。但是因为线程切换和上下文转换的消耗会使得垃圾回收的总体成本上升造成系统吞吐量的下降。 分区算法 基本思想一般来说在相同条件下堆空间越大一次 GC 时所需要的时间就长有关 GC 产生的停顿也越长。为了更好地控制 GC 产生的停顿时间将一块大的内存区域分割成多个小块根据目标的停顿时间每次合理地回收若干个小区间而不是整个堆空间从而减少一次 GC 所产生的停顿。 注意分区算法与分代收集算法是不同的分代收集算法将按照对象的生命周期长短划分成两个部分而分区算法将整个堆空间划分成连续的不同小区间其中每个小区间都独立使用独立回收这样可以控制一次回收多少个小区间。 总结 增量收集算法是将总的收集量一部分一部分的去执行 分区算法是将总的内存空间分为小分区一次可控的去收集多少个小区间。 SafePoint 程序执行时并非可以在任何地方都能停顿下来开始 GC只有在特定的位置才能停顿下来开始 GC这些位置称为Safepoint 。 SafePoint 的选择很重要如果太少可能导致 GC 等待的时间太长如果太频繁可能导致运行时的性能问题。 大部分指令的执行时间都非常短暂通常会根据是否具有让程序长时间执行的特征为标准。比如选择一些执行时间较长的指令作为 SafePoint如方法调用、循环跳转和异常跳转等。
http://www.zqtcl.cn/news/172470/

相关文章:

  • 购物网站项目经验搭建网站流程
  • 网站建设企业蛋糕怎么做网站里导出没有水印的图
  • 享设计网做兼职设计师怎么样何鹏seo
  • 淘宝联盟网站推广位怎么做网站建设小知识
  • 徐州有办网站的地方吗企业做网站多少钱
  • 地铁公司招聘信息网站通江县网站建设
  • 家具网站 模板上海虹口建设局官方网站
  • 网站建站建设哪家好wordpress全站静态
  • 旅游网站建设策划seo顾问多少钱
  • 个人网站注册平台要多少钱彩票网站开发 违法
  • 贵州城乡住房和建设厅网站易企秀网站开发语言
  • 返利网站做鹊桥推广免费的舆情网站入口在哪
  • 网站商城怎么做wordpress图片采集插件
  • 做美团网站代码swoole+wordpress
  • 百度免费资源网站搭建发卡网站要多少钱
  • ip网站怎么做酷家乐手机版
  • cnzz统计代码如何添加到网站上去照片网站源码
  • 我的世界电影怎么做的视频网站网页布局实训心得体会
  • 网站建设公司内部情况凡客诚品陈年
  • 浙江建设职业技术学院迎新网站商务网站建设体会
  • 做网站的目的与意义做家教去什么网站
  • 相城网站建设为什么网站建设价格不一
  • 网站icp备案手续我做的网站平台百度搜不到
  • 本溪网站设计公司ps转页面wordpress插件
  • 怎么做短链接网站搜索引擎优化的各种方法
  • 自己做网站怎么挣钱微网站建站系统源码
  • 湖北省网站备案最快几天网站建设存在的具体问题
  • 网站建设算固定资产吗做网站都需要什么软件
  • ui设计培训是什么seo外链网站源码
  • 网站开发浙里建系统平台