c语言做网站后台服务,跨境电子商务主要学什么,钓鱼网站网站怎么做,怎么给自己的网站做seo是先有垃圾回收器再有JVM呢#xff0c;还是先有JVM再有垃圾回收器呢#xff1f;或者是先有垃圾回收再有JVM呢#xff1f;历史上还真是垃圾回收更早面世#xff0c;垃圾回收最早起源于1960年诞生的LISP语言#xff0c;Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…是先有垃圾回收器再有JVM呢还是先有JVM再有垃圾回收器呢或者是先有垃圾回收再有JVM呢历史上还真是垃圾回收更早面世垃圾回收最早起源于1960年诞生的LISP语言Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析JVM的垃圾回收~ 文章目录 1. 判断可回收对象1.1 引用计数法1.2 可达性分析算法 2. 垃圾回收器2.1 垃圾回收区域2.2 回收永久代2.3 垃圾回收器2.4 CMS原理2.5 CMS的缺点2.6 G1垃圾回收器 3. 垃圾回收算法3.1 优化复制算法 未完待续。。。 1. 判断可回收对象
1.1 引用计数法 面试官JVM为什么不采用引用计数法 每个Java对象在引用计数法里都有一个引用计数器引用失效则计数器 - 1有新的引用则计数器 1通过计数器的数值来判断该对象是否是可回收对象。
大家看下这个例子如果对象A和对象B没有被任何对象引用也没有被任何线程访问这两个对象按理应该被回收。但如果对象A的成员变量引用了对象B对象B的成员变量引用了对象A它们的引用计数器数值都不为0通过引用计数法并不能将其视为垃圾对象。 class A {B b new B();}class B {A a new A();}就因为引用计数法很难解决对象之间相互循环引用的问题所以目前JVM采用可达性分析算法来判断Java对象是否是可回收对象。
1.2 可达性分析算法 面试官那你讲讲可达性分析算法 可达性分析顾名思义就是以某个起始点来判断它是否可达这个起始点称为GC Roots。如果Java对象不能从GC Roots作为起始点往下搜索到那该对象就被视为垃圾对象即可回收对象。 可以作为GC Roots对象一共包括以下四种这点也是面试官常问的
虚拟机栈中引用的对象。本地方法栈中引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。
2. 垃圾回收器
2.1 垃圾回收区域 面试官垃圾回收器回收的是哪个区域 JVM由五大区域组成堆内存、方法区、程序计数器、虚拟机栈、本地方法栈。先说结论垃圾回收器回收的是堆内存和方法区两大区域。
程序计数器、虚拟机栈、本地方法栈的内存分配和回收都具备确定性都是随着线程销毁而销毁因此不需要进行回收。
但在堆内存、方法区中内存分配和回收都是动态的我们只有在运行期间才能知道会创建哪些对象另外这些垃圾对象不会自动销毁如果任由这两部分区域的垃圾对象不管势必造成内存的浪费甚至有内存泄漏的可能。
垃圾回收器存在的意义就是通过自动检测和回收这些垃圾对象来减少内存泄漏的风险。
2.2 回收永久代 面试官那永久代不会进行垃圾回收对吧 虽然永久代的垃圾回收效率是比较低的但永久代里的废弃常量和无用的类仍然会被回收。
例如创建一个字符串常量name该字符串会存在于常量池中。如果该字符串没有任何String对象去引用它当发生内存回收时有必要会清除该废弃常量。
private static final String name JavaGetOffer;2.3 垃圾回收器 面试官你说说都有哪些垃圾回收器 目前市面上共有七种垃圾回收器。 Serial是一个作用在新生代的单线程垃圾回收器。在垃圾回收期间系统的所有线程都会阻塞因此垃圾回收效率也相对较高。 ParNew则是Serial的多线程版本。这也是第一款并发的垃圾回收器相比Serial来说垃圾回收不需要阻塞所有线程第一次实现了让垃圾回收线程和用户线程同时工作。 Serial Old是Serial的老年代版本。 Parallel Scavenge同样是作用在新生代且是多线程不过它的设计目标是达到一个可控制的吞吐量。 Parallel Old是Parallel Scavenge收集器的老年代版本我们可以把它和Parallel Scavenge搭配一起使用。 CMS是一种以最短停顿时间为目标的多线程收集器下文我会介绍CMS实现最短停顿的原理。 G1收集器可以说是CMS的升级版。
我们可以根据业务实际情况来为各个年代搭配不同的垃圾回收器以下的垃圾回收器如果有线连接说明它们之间可以搭配使用。 2.4 CMS原理 面试官你说的CMS为什么有较短的停顿 CMS采用了标记-清除算法整个运作过程分为了初始标记、并发标记、重新标记、并发清除四个阶段。
其中初始标记、重新标记的停顿时间是比较短的而耗时最长的并发标记、并发清除能够和用户线程一起并发工作不需要停顿可以说CMS只需要造成初始标记、重新标记带来的短时间停顿。
2.5 CMS的缺点 面试官那它有什么缺点 CMS是多线程的在垃圾回收时会占用一部分线程可能会使系统变得相对较慢。CMS并发清理时用户线程还在运行着也就是说还会有新的垃圾不断产生这些垃圾被称为浮动垃圾。因为浮动垃圾产生在标记阶段后很明显CMS本次收集是无法处理这些浮动垃圾的只能等到下一次GC回收。CMS采用标记-清除算法标记-清除算法的缺点是会产生空间碎片有可能造成大对象找不到足够的连续空间而发生OOM的情况。
2.6 G1垃圾回收器 面试官你说G1是CMS的升级版为什么 G1垃圾回收器设计之初被赋予的使命是未来可以替换掉JDK1.5中发布的CMS垃圾回收器。所以大家可想而知CMS垃圾回收器的优点G1垃圾回收器都有另外G1垃圾回收器也避免了CMS的一些不足。
G1采用的垃圾回收算法是标记-整理算法避免了CMS采用标记-清除可能产生的空间碎片。其他收集器在新生代、老年代分别采用不同收集器进行配合而G1垃圾回收器可以不需要其他收集器配合就能独立管理整个GC。
3. 垃圾回收算法 面试官垃圾回收算法都有什么 垃圾回收算法一共有四种其中最基础的垃圾回收算法是标记-清除算法其他算法其实都是对标记-清除算法的优化而产生的我们继续往下看。
1标记-清除算法。
标记-清除算法顾名思义分为标记和清除两个阶段首先标记出所有可回收的对象标记完成后统一进行清除。但该算法有一个缺点被标记和未标记的对象都是分散存储在内存中的当清除标记对象后会出现空间碎片的情况如下图 2复制算法。
复制算法把内存划分为容量相等的两块每次只使用一块当这一块内存不足时就将存活的对象复制到另一块中同时清除当前块的内存空间。这种算法实现简单且运行高效也不会产生空间碎片的情况因为新生代的GC是比较频繁的所以复制算法也广泛用于新生代的垃圾回收。但缺点很明显是浪费了50%的内存空间。
3标记-整理算法。
标记-整理算法是对标记-清除算法的优化。该算法在内存到达一定量后会把所有已标记的垃圾对象都向一端里移动然后以存活对象所在的一端为边界清除边界内所有内存避免了标记-清除算法可能产生的空间碎片。
4分代收集算法。
一般实际业务系统都是采用分代收集算法。分代顾名思义把JVM内存拆分分为了新生代、老年代对不同年代的垃圾回收采用不同的垃圾回收算法来确保回收效率。
大家可以看下自己公司的JDK使用了什么垃圾回收器加深下对本篇的理解。
# 打印JVM启动时的命令行标志
java -XX:PrintCommandLineFlags -version3.1 优化复制算法 面试官复制算法可以怎么优化吗 复制算法把内存划分为容量相等的两块也就是按11分配内存但这也浪费了50%空间。
可以把内存分为一块较大的Eden空间和两块较小的Survivor空间每次只使用Eden空间和其中一块Survivor空间而另一块Survivor空间用来保存回收时还存活的对象。这样就只浪费了其中一块Survivor空间的内存。
✨覆盖Java程序员所需掌握的Java核心知识、面试重点本博客收录在我开源的《Java学习面试指南》中会一直完善下去希望收到大家的 ⭐ Star ⭐支持这是我创作的最大动力 https://github.com/hdgaadd/JavaGetOffer
未完待续。。。 创作不易不妨点赞、收藏、关注支持一下各位的支持就是我创作的最大动力❤️