高级会员
- 威望
- 371
- 贡献
- 478
- 热心值
- 0
- 金币
- 19
- 注册时间
- 2020-3-29
|
22. 你了解哪些垃圾收集器?
• Serial 收集器:单线程、简单高效(与其他收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程手机效率。收集器进行垃圾回收时,必须暂停其他所有的工作线程,直到它结束(Stop The World)。
○ 适用于Client模式下的虚拟机。
• ParNew收集器:ParNew收集器其实就是Serial收集器的多线程版本,ParNew收集器默认开启的收集线程数与CPU的数量相同,和Serial收集器一样存在Stop The World问题
○ ParNew收集器是许多运行在Server模式下的虚拟机中首选的新生代收集器,因为它是除了Serial收集器外,唯一一个能与CMS收集器配合工作的。
• Parallel Scavenge 收集器:属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器
• Serial Old 收集器:Serial Old是Serial收集器的老年代版本,同样是单线程收集器,采用标记-整理算法
• Parallel Old 收集器:是Parallel Scavenge收集器的老年代版本,多线程,采用标记-整理算法
○ 注重高吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge+Parallel Old 收集器
• CMS收集器:一种以获取最短回收停顿时间为目标的收集器,基于标记-清除算法实现。并发收集、低停顿。
○ 适用于注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如web程序、b/s服务。
• G1收集器:一款面向服务端应用的垃圾收集器。
○ 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让Java程序继续运行。
○ 分代收集:G1能够独自管理整个Java堆,并且采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。
○ 空间整合:G1运作期间不会产生空间碎片,收集后能提供规整的可用内存。
○ 可预测的停顿:G1除了追求低停顿外,还能建立可预测的停顿时间模型。能让使用者明确指定在一个长度为M毫秒的时间段内,消耗在垃圾收集上的时间不得超过N毫秒。
23. 讲一下CMS垃圾收集器垃圾回收的流程,以及CMS的缺点?
• CMS收集器的运行过程分为下列4步:
○ 初始标记:标记GC Roots能直接到的对象。速度很快但是仍存在Stop The World问题。
○ 并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。
○ 重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题。
○ 并发清除:对标记的对象进行清除回收。
• CMS收集器的内存回收过程是与用户线程一起并发执行的。
• CMS收集器的缺点:
○ 对CPU资源非常敏感。
○ 无法处理浮动垃圾,可能出现Concurrent Model Failure失败而导致另一次Full GC的产生。
○ 因为采用标记-清除算法所以会存在空间碎片的问题,导致大对象无法分配空间,不得不提前触发一次Full GC。
24. CMS回收停顿了几次?为什么要停顿两次?
2次,初始标记和重新标记阶段会产生停顿
25. CMS会不会产生内存碎片?老年代产生内存碎片会有什么问题?
会产生内存碎片,老年代产生内存碎片过多会触发full gc
26. jvm g1的内存模型讲一下?
G1 算法取消了堆中年轻代与老年代的物理划分,但它仍然属于分代收集器。G1 算法将堆划分为若干个区域,称作 Region
27. G1回收器讲下回收过程?
• 初始标记:仅标记GC Roots能直接到的对象,并且修改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的Region中创建新对象。(需要线程停顿,但耗时很短。)
• 并发标记:从GC Roots开始对堆中对象进行可达性分析,找出存活对象。(耗时较长,但可与用户程序并发执行)
• 最终标记:为了修正在并发标记期间因用户程序执行而导致标记产生变化的那一部分标记记录。且对象的变化记录在线程Remembered Set Logs里面,把Remembered Set Logs里面的数据合并到Remembered Set中。(需要线程停顿,但可并行执行。)
• 筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。(可并发执行)
28. G1和CMS收集器的区别?
• 使用范围不一样
○ CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
○ G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用
• STW的时间
○ CMS收集器以最小的停顿时间为目标的收集器
○ G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
• 垃圾碎片
○ CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
○ G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片
• 垃圾回收的过程不一样
○ CMS收集器:初始标记、并发标记、重新标记、并发清除
○ G1收集器:初始标记、并发标记、最终标记、筛选回收
29. G1收集器对CMS的改进?
• 区域块级化,增加 H 区 。(大对象,巨型对象区)
• 优化垃圾回收清理阶段的逻辑。
• 由用户控制最大 STW 时间,优化用户体验。
30. 内存泄漏与内存溢出的区别?
• 内存溢出 OutOfMemory,指程序在申请内存时,没有足够的内存空间供其使用。
• 内存泄露 Memory Leak,指程序在申请内存后,无法释放已申请的内存空间,内存泄漏最终将导致内存溢出。
31. 如何理解内存泄漏问题?有哪些情况会导致内存泄露?如何解决?
• 静态集合类泄漏:集合如果只有添加元素的方法,没有相应的删除机制,就会到之后内存被占用。如果这个集合是全局的变量,没有相应的删除机制,就会导致集合占用的内存只增加不减。
• 单例造成的内存泄漏:单列的静态特性的生命周期和应用的生命周期一样长,如果使用不恰当,就会造成内存泄露。
• 资源未关闭造成的内存泄漏
32. 类加载的过程是什么?
• 加载
○ 获取类的二进制字节流
○ 将字节流代表的静态存储结构转化为方法区运行时数据结构
○ 在堆中生成class字节码对象
• 验证:连接过程的第一步,确保 class 文件的字节流中的信息符合当前 JVM 的要求,不会危害 JVM 的安全
• 准备:为类的静态变量分配内存并将其初始化为默认值
• 解析:JVM 将常量池内符号引用替换成直接引用的过程
• 初始化:执行类构造器的初始化的过程
33. 双亲委派机制及使用原因?
• 双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。
• 使用原因:
○ 防止加载同一个.class。通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载。保证了数据安全。
○ 保证核心.class不被篡改。通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。
|
|