Java中怎么实现内存回收


Java中怎么实现内存回收,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。各个线程共享的内存区域,用于储蓄已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 方法区有时也被称为永久代。在 JDK1.8 及之后取消了永久代,取而代之的是元空间。在永久代中做调优是十分困难的,且效果不明显。永久代的空间大小受制于 JVM 本身内存限制,而元空间是直接使用机器的内存,只受系统内存限制。元空间默认最大大小为无限制。 一些参数:堆是 Java 虚拟机所管理的内存中最大的一块,是所有线程所共享的,此内存区域的唯一目的就是存放对象实例。堆是垃圾收集器管理的主要区域。在 HotSpot 中,大多数情况下内存被分为新生代和老年代,默认分配比例为 1:2。在新生代中又被分为一个 Eden 和两个 Survivor ,分配比例为 8:1:1。新生代中对象的年龄在经历一次 Minor GC 后年龄会+1,当年龄达到15(默认值)后会进入老年代。 一些参数:线程私有,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。包含程序计数器、虚拟机栈和本地方法栈。哪些对象需要回收?引用计数算法 给对象一个引用计数器,每当有一个地方引用它时,计数器就加 1,当引用失效时就减 1。任何计数器为 0 的对象都是不被使用的对象。 缺点:难以解决循环引用问题。可达性分析算法 通过一系列的“GC Roots”作为起点,从这些节点开始向下搜索搜索所达到的路径称为引用链。当一个对象不在任何引用链中,则此对象是不被使用的对象。什么时候回收?可达性分析算法 中从 GC Roots 搜索时,必须保证引用的一致性,以使对象的引用关系不再发生变化。这点就导致了 GC 必须停止所有的执行线程(Stop The World)。 在 HotSpot 中使用 OopMap 来记录调用信息。在代码中有 OopMap 记录的地方称为 SafePoint。当 GC 发生时,需要让所有线程先跑到 SafePoint 再执行 GC 操作。如何回收?标记-清除算法 同名字一样,这个方式分为“标记”和“清除”两个阶段,首先对不被使用的对象添加一个标记,之后对所有标记到的对象进行统一回收。 缺点:标记和清除两个阶段的效率都不高在回收之后会产生大量不连续的内存碎片,导致以后难以储存较大的对象复制算法 将对象分为两块,当一块对象用完了,就将还在使用的对象复制到另一块对象上去。较 标记-清除算法 有更高的效率 缺点:每次只能使用一块内存,使内存的利用率变低了。标记-整理算法 前半部分和 标记-清除算法 一样,但后续将所有存活的对象移向一端,清除了内存碎片。分代收集算法 根据对象的不同 香港云主机存活周期,一般把对象分为新生代和老年代,根据各个年代的特点采用不同的收集算法。 对于新生代,每次都有大量对象死去,故采用复制算法。 对于老年代,对象存活率高,采用 标记-清除标记-整理 算法。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Serial 一个最基本、发展历史最悠久的收集器。采用单线程的收集方式,且在收集时必须暂停其他所有的工作线程,直到收集结束。在 Client 模式下有较好效果。ParNew ParNew 收集器就是 Serial 的多线程版本,能与 CMS 配合工作。Parallel Scavenge 吞吐量优先的收集器。(吞吐量=用户代码运行时间/(用户代码运行时间+垃圾收集时间))Serial Old Serial 的老年代版本Parallel Old Parallel Scavenge 的老年代版本,JDK1.7、JDK1.8 中以 Parallel Scavenge + Parallel Old 为默认的新生代、老年代回收器。CMS 以最短回收停顿时间为目的,对 CPU 资源敏感G1 JDK1.9 中的默认垃圾收集器,G1 的主要关注点在于达到可控的停顿时间,在这个基础上尽可能提高吞吐量。G1 中每个块也会充当 Eden、Survivor、Old 三种角色,但是它们不是固定的,这使得内存使用更加地灵活。在 HotSpot 中,大多数情况下内存被分为新生代和老年代,默认分配比例为 1:2。在新生代中又被分为一个 Eden 和两个 Survivor ,分配比例为 8:1:1。 一个新的对象一般会在新生代 Eden 区中分配。当 Eden 区没有足够空间进行分配时,将发起一次 Minor GC。 对于大对象(大量连续内存空间的Java对象),会直接进入老年代。 长期存活的对象(默认熬过 15 次 Minor GC),会进入老年代。 如果在 Survivor 中相同年龄的对象超过了 Survivor 的一般,这些对象将会直接进入老年代。一些用于监视虚拟机状态和故障处理的命令看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注开发云行业资讯频道,感谢您对开发云的支持。

相关推荐: jquery如何替换类名

今天小编给大家分享一下jquery如何替换类名的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅 香港云主机读完这篇文章后有所收获,下面我们一起来了解一下吧。具体步骤如下:1.首先,新建一个html…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/27 18:17
Next 07/27 18:17

相关推荐