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

艺术设计类网站产品推广方案范本3篇

艺术设计类网站,产品推广方案范本3篇,技术网站推广范例,微信购物商城【学习笔记】深入理解JVM之垃圾回收机制 更多文章首发地址#xff1a;地址 参考#xff1a; 《深入理解JAVA虚拟机》第三版 第三章尚硅谷 第134 - 203 集参考文章#xff1a;https://blog.csdn.net/qq_48435252/article/details/123697193 1、概念 #x1f33b; 首先我们…【学习笔记】深入理解JVM之垃圾回收机制 更多文章首发地址地址 参考 《深入理解JAVA虚拟机》第三版 第三章尚硅谷 第134 - 203 集参考文章https://blog.csdn.net/qq_48435252/article/details/123697193 1、概念 首先我们要知道在程序中 垃圾 是怎么样的一个定义 在现实中我们知道 垃圾 是我们人类丢弃的废弃物品而在程序中也是相对如此 垃圾 是指在运行程序中没有任何指针指向的对象这个对象就是需要被回收的垃圾。 如果不及时对内存中的垃圾进行清理那么这些垃圾对象所占的内存空 间会一直保留到应用程序结束被保留的空间无法被其他对象使用。甚至可能导致内存溢出。 为什么需要垃圾回收机制呢 面对这个问题我们也可以想一想我们人类自己的生存问题如果我们一直不解决 垃圾 的存储问题则可能会导致我们生存的地方被 垃圾 所侵占从而导致没有生存空间。 对于高级语言来说一个基本认知是如果不进行 垃圾回收 内存迟早都会被消耗完因为不断地分配内存空间而不进行回收就好像不停地生产生活 垃圾 而从来不打扫一样。除了释放没用的对象垃圾回收 也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端以便 JVM 将整理出的内存分配给新的对象。 2、常见的垃圾回收算法 概念补充对象已死 在堆里面存放着Java世界中几乎所有的对象实例垃圾收集器在对堆进行回收前第一件事情就 是要确定这些对象之中哪些还“存活”着哪些已经“死去”(“死去”即不可能再被任何途径使用的对 象)了。 判断对象存活一般有两种方式引用计数算法 和 可达性分析算法 。 我们比较常见的 垃圾回收算法 有以下几种 引用计数法可达性分析算法标记清除算法复制算法标记压缩算法 2.1 引用计数法 概念 引用计数算法Reference Counting 比较简单对每个对象保存一个整型 的引用计数器属性。用于记录对象被引用的情况。 对于一个对象 A只要有任何一个对象引用了 A则 A 的引用计数器就加1当引用失效时引用计数器就减1。只要对象 A 的引用计数器的值为0即表示对象A不可能再被使用可进行回收。 优点 实现简单方便回收效率高 缺点 需要单独的 字段存储计数器 这样的做法增加了存储空间的开销。每次赋值都需要更新计数器伴随着加法和减法操作这增加了时间开销。引用计数器有一个严重的问题即无法处理循环引用的情况。这是一 条致命缺陷导致 在Java的垃圾回收器中没有使用这类算法如下图 2.2 可达性分析算法 这个算法的基本思路 就是通过 一系列称为 “GC Roots” 的根对象作为起始节点集从这些节点开始根据引用关系向下搜索搜索过 程所走过的路径称为 “引用链”(Reference Chain) 如果某个对象到 GC Roots 间没有任何引用链相连 或者用图论的话来说就是从 GC Roots 到这个对象不可达时则证明此对象是不可能再被使用的。 在 Java 技术体系里面固定可作为 GC Roots 的对象包括以下几种: 栈帧中的本地变量表中引用的对象。 静态变量。 字符串常量池里的引用。 在本地方法栈中 JNI(即通常所说的Native方法) 引用的对象。 Java 虚拟机内部的引用如基本数据类型对应的 Class对象 一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError )等还有系统类加载器。 所有被同步锁(synchronized关键字)持有的对象. 2.3 对象的finalization机制 Java语言提供了对象终止 finalization 机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。当垃圾回收器发现没有引用指向一个对象即垃圾回收此对象之前总会先调用这个对象的 finalize 方法。finalize 方法允许在子类中被重写用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作比如关闭文件、套接字和数据库连接等。永远不要主动调用某个对象的 finalize 方法应该交给垃圾回收机制调用。理由包括下面三点 ➢在 finalize() 时可能会导致对象复活。➢ finalize() 方法的执行时间是没有保障的它完全由GC线程决定极端情况下若不发生GC则 finalize() 方法将没有执行机会。➢一个糟糕的 finalize 会严重影响GC的性能。 从功能上来说finalize方法与C 中的析构函数比较相似但是Java采用的是基于垃圾回收器的自动内存管理机制所以finalize方法在本质上不同于C 中的析构函数。 2.4 判断对象的死亡 即使在可达性分析算法中判定为不可达的对象也不是 “非死不可” 的这时候它们暂时还处于 “缓刑” 阶段要真正宣告一个对象死亡至少要经历两次标记过程如果对象在进行可达性分析后发现没 有与 GC Roots 相连接的引用链那它将会被第一次标记随后进行一次筛选筛选的条件是此对象是 否有必要执行 finalize() 方法。假如对象没有覆盖 finalize() 方法或者 finalize() 方法已经被虚拟机调用过那么虚拟机将这两种情况都视为 “没有必要执行” 。 如果对象重写了 finalize() 方法且还没有执行该方法则会把该对象插入到 F一Queue 队列中由一个虚拟机自动创建的、低优先级的 Finalizer 线程触发其 finalize 方法执行。 2.5 标记清除算法 概念 如它的名字一样算法分为 “标记” 和 “清除” 两个阶段首先标记出所有需要回收的对象在标记完成后统一回收掉所有被标记的对象也可以反过来标记存活的对象统一回收所有未被标记的对象。 如图 优点 比较简单且经常使用。 缺点 第一个是执行效率不稳定如果 Java 堆中包含大量对象而且其中大部分是需要被回收的这时必须进行大量标记和清除的动作导致标记和清除两个过程的执行效率都随对象数量增长而降低;第二个是内存空间的碎片化问题标记、清除之后会产生大 量不连续的内存碎片空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找 到足够的连续内存而不得不提前触发另一次垃圾收集动作。 2.6 复制算法 为了解决 标记-清除算法 面对大量可回收对象时执行效率低的问题1969年Fenichel提出了一种称为 “半区复制”(Semispace Copying) 的垃圾收集算法它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。 核心思想 将活着的内存空间分为两块每次使用一块进行垃圾回收的时候将存活对象复制到另一块未使用的区域然后将源区域清空然后交换两个内存的角色 优点 没有标记和清除过程实现简单运行高效复制过去以后保证空间连续性不会出现 “碎片” 问题。 缺点 此算法的缺点也是很明显的就是需要两倍的内存空间。对于 G1 这种分拆成为大量 region 的 GC 复制而不是移动意味着 GC 需要维护 region 之间对象引用关系不管是内存占用或者时间开销也不小。特别的如果系统中的可用对象很多复制算法不会很理想因为要复制大量的对象。 在新生代对常规应用的垃圾回收一次通常可以回收70%一 99%的内存空间。回收性价比很高。所以现在的商业虚拟机都是用这种收集算法回收新生代。 2.7 标记压缩算法 背景 复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生但是在老年代更常见的情况是大部分对象都是存活对象。如果依然使用复制算法由于存活对象较多复制的成本也将很高。因此基于老年代垃圾回收的特性需要使用其他的算法。 标记一清除算法的确可以应用在老年代中但是该算法不仅执行效率低下而且在执行完内存回收后还会产生内存碎片所以JVM的设计者需要在此基础之上进行改进。标记一压缩Mark一Compact 算法由此诞生。 1970年前后G. L. Steele 、C. J. Chene和D.S. Wise 等研究者发布标记一压缩算法。在许多现代的垃圾收集器中人们都使用了标记一压缩算法或其改进版本。 核心思想 第一阶段和标记一清除算法一样从根节点开始标记所有被引用对象.第二阶段将所有的存活对象压缩到内存的一端按顺序排放。之后清理边界外所有的空间。 标记一压缩算法 的最终效果等同于标记一清除算法执行完成后再进行一次内存碎片整理因此也可以把它称为标记一清除一压缩Mark一 Sweep一Compact算法。 二者的本质差异在于 标记清除算法 是一种 非移动式 的回收算法标记压缩 是移动式的。是否移动回收后的存活对象是一项优缺点并存的风险决策。 清除算法的对比 属性\算法标记清除算法复制算法标记压缩算法时间复杂度中快满空间复杂度少占用2倍少内存碎片有无无移动对象否是是 2.8 分代收集算法 前面所有这些算法中并没有一种算法可以完全替代其他算法它们都具有自己独特的优势和特点。分代收集算法应运而生。 分代收集算法是基于这样一个事实不同的对象的生命周期是不一样的。因此不同生命周期的对象可以采取不同的收集方式以便提高回收效率。 一般是把 Java 堆分为 新生代 和 老年代 这样就可以根据各个年代的特点使用不同的回收算法以提高垃圾回收的效率。 目前几乎所有的GC都是采用分代收集Generational Collecting 算法执行垃圾回收的。 在HotSpot中基于分代的概念GC所使用的内存回收算法必须结合年轻代和老年代各自的特点。 年轻代Young Gen 年轻代特点区域相对老年代较小对象生命周期短、存活率低回收频繁。这种情况复制算法的回收整理速度是最快的。复制算法的效率只和当前存活对象大小有关因此很适用于年轻代的回收。而复制算法内存利用率不高的问题通过 hotspot 中的两个 survivor 的设计得到缓解。 老年代Tenured Gen 老年代特点区域较大对象生命周期长、存活率高回收不及年轻代频繁。这种情况存在大量存活率高的对象复制算法明显变得不合适。一般是由标记清除或者是标记整理的混合实现。 ➢标记阶段的开销与存活对象的数量成正比。➢清除阶段的开销与所管理区域的大小成正相关。➢压缩阶段的开销与存活对象的数据成正比。 3、内存溢出与内存泄露 3.1 内存溢出 内存溢出 内存溢出 相对于 内存泄漏 来说尽管更容易被理解但是同样的内存溢出 也是引发程序崩溃的罪魁祸首之一。由于 GC 一直在发展所有一般情况下除非应用程序占用的内存增长速度非常快造成垃圾回收已经跟不上内存消耗的速度否则不太容易出现 OOM 的情况。大多数情况下 GC 会进行各种年龄段的垃圾回收实在不行了就放大招来一次独占式的 Full GC 操作这时候会回收大量的内存供应用程序继续使用。javadoc 中对 OutOfMemoryError 的解释是没有空闲内存并且垃圾收集器也无法提供更多内存。 首先说没有空闲内存的情况说明Java虚拟机的堆内存不够原因有二 1 Java 虚拟机的堆内存设置不够。 比如可能存在 内存泄漏 问题也很有可能就是堆的大小不合理比如我们要处理比较可观的数据量但是没有显式指定 JVM 堆大小或者指定数值偏小。我们可以通过参数 一Xms、一Xmx 来调整。2代码中创建了大量大对象并且长时间不能被垃圾收集器收集存在被引用对于老版本的 Oracle JDK 因为永久代的大小是有限的并且 JVM 对永久代垃圾回收如常量池回收、卸载不再需要的类型非常不积极所以当我们不断添加新类型的时候永久代出现 OutOfMemoryError 也非常多见尤其是在运行时存在大量动态类型生成的场合类似 intern 字符串缓存占用太多空间也会导致 OOM 问题。对应的异常信息会标记出来和永久代相关 “java. lang. OutOfMemoryError PermGen space” 。 随着元数据区的引入方法区内存已经不再那么窘迫所以相应的OOM有所改观出现OOM异常信息则变成了“java. lang. OutOfMemoryError Metaspace 。 直接内存不足也会导致 OOM 。 这里面隐含着一层意思是在抛出 OutOfMemoryError 之 前通常垃圾收集器会被触发尽其所能去清理出空间。 ➢例如在引用机制分析中涉及到JVM会去尝试回收软引用指向的对象等。➢在 java.nio.BIts.reserveMemory 方法中我们能清楚的看到System.gc 会被调用以清理空间。 当然也不是在任何情况下垃圾收集器都会被触发的。比如我们去分配一一个超大对象类似一个超大数组超过堆的最大值 JVM 可以判断出垃圾收集并不能解决这个问题所以直接拋出 OutOfMemoryError 3.2 内存泄漏(Memory Leak) 也称作 “存储渗漏” 。严格来说只有对象不会再被程序用到了但是 GC 又不能回收他们的情况才叫 内存泄漏 。但实际情况很多时候一些不太好的实践或疏忽会导致对象的生命周期变得很长甚至导致内存溢出 OOM 也可以叫做宽泛意义上的 内存泄漏 .尽管内存泄漏并不会立刻引起程序崩溃但是一旦发生内存泄漏程序中的可用内存就会被逐步蚕食直至耗尽所有内存最终出现0utOfMemory 异常导致程序崩溃。 注意这里的存储空间并不是指物理内存而是指虚拟内存大小这个虚拟内存大小取决于磁盘交换区设定的大小。 举例 1、单例模式 单例的生命周期和应用程序是一样长的所以单例程序中如果持有对外部对象的引用的话那么这个外部对象是不能被回收的则会导致内存泄漏的产生。2、一些提供 close 的资源未关闭导致内存泄漏 数据库连接 dataSourse. getConnection网络连接socket和io连接必须手动close否则是不能被回收的。 4、垃圾回收器 1.优先调整堆的大小让JVM自适应完成。2.如果内存小于100M使用串行收集器3.如果是单核、单机程序并且没有停顿时间的要求串行收集器4.如果是多CPU、需要高吞吐量、允许停顿时间超过1秒选择并行或者JVM自己选择5.如果是多CPU、追求低停顿时间需快速响应比如延迟不能超过1秒如互联网应用使用并发收集器官方推荐G1性能高。现在互联网的项目基本都是使用G1。
http://www.w-s-a.com/news/119868/

相关文章:

  • 网页设计基础代码网站进出成都最新通知
  • 如何创建网站乐清网络科技有限公司
  • 沈阳市网站制作艺术字体logo设计生成器
  • 网站设计常用软件都有哪些中国建设银行官方招聘网站
  • 证券投资网站建设视频直播怎么赚钱的
  • 建设酒店网站ppt模板下载郑州小程序设计外包
  • 网站建设自我总结google推广公司
  • 安全网站建设情况wordpress 评论表单
  • 网站建设发言材料个人网站推广软件
  • php建站软件哪个好南京哪家做网站好
  • 排名好的手机网站建设番禺网站建设专家
  • 番禺怎么读百度有专做优化的没
  • 网站开发中应注意哪些问题网络营销的主要特点
  • 网站定制案例北京网站制作招聘网
  • 网站建设与推广实训小结网站建设专业英文
  • 郑州网站建设动态凡科网站建设是免费的吗
  • 湖北手机网站建设wordpress转emlog博客
  • 北京东站设计网名的花样符号
  • 安徽建设厅网站首页网站开发aichengkeji
  • 自贡网站制作荣茂网站建设
  • 什么做的网站吗正规的机械外包加工订单网
  • 网络工程公司的业务邵阳seo快速排名
  • 博主怎么赚钱网站seo找准隐迅推
  • 营销号经典废话北京网站建设公司网站优化资讯
  • 一六八互联网站建设怎么做套版网站
  • wordpress 书站建筑公司简介范文大全
  • 建设官方网站多少鲜花网站建设的主要工作流程
  • 卖主机网站轻量wordpress主题
  • 网站建设规划书结构制作一个自己的网站
  • 外贸网站商城建设做网站和推广