美文网首页
java高频面试总结(JVM篇)

java高频面试总结(JVM篇)

作者: 吗丁啉要餐前吃 | 来源:发表于2019-09-29 13:43 被阅读0次

1.讲一下什么是JVM?

答:java Virtual Machine,java虚拟机,是java运行时的环境,用来存储java程序运行时的信息。分为:堆区、栈区、方法区。结构如图:


image.png
  • 方法区:主要用来存放类信息,常量池(static常量和static变量),编译后的代码(字节码)等数据。
  • 堆:初始化的对象,成员变量(非static变量),所有的对象实例和数组
  • 栈:栈的结构是由栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是8大基本了类型加上一个应用类型,所以还是一个指向地址的指针。
  • 本地方法栈:主要为Native方法服务
  • 程序计数器:记录当前线程执行的行号

2.堆里的分区有哪些,各自的特点是什么?

答:堆分为:新生代和老年代,新生代又分为eden区、frorm survivor和to suvivor。

3.java中垃圾回收的算法都有哪些?

答:
1)标记清除:标记出来要回收的对象,然后统一回收。缺点是(1)效率低,标记和清除效率都低;(2)会产生大量不连续的内存碎片。
2)复制算法:将内存分为相等的两部分,每次使用其中给的一块,当A内存用完时,将还存活的对象复制到B;然后一次性清除A中的内存,再将B的内存复制到A。缺点是内存的代价太高,每次要浪费一半的内存。
3)标记整理:主要是解决标记清除后内存碎片的问题,当对象存活率较高时,也解决了复制算法的效率问题。
4)分代收集:根据对象的声明周期,将堆分为新生代和老年代。新生代中,对象生存期短,每次回收都有大量对象死去,那么就用复制算法。老年代对象存活率高,没有额外的空间进行分配担保,可以使用标记-整理或者标记-清除。

4.java中的垃圾回收器有哪些?

答:1)Serial/Serial Old :最古老的的,单线程,独占式,成熟,适合单CPU服务器。-XX:+UseSerialGC
2)ParNew :和Serial基本没有区别,唯一的区别就是:多线程,多CPU,停顿时间比Serial少。-XX:+UseParNewGC(新生代使用ParNew,老年代使用Serial Old)
3)Parallel Scavenge(ParallerGC)/Parallel Old : 关注吞吐量的垃圾收集器,高吞吐量则可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
4)Concurrent Mark Sweep(CMS):一种以获取最短回收停顿时间为目标的收集器,基于“标记-清除”算法实现。主要过程为:初始标记(STW很短,仅标记GC Roots能直接关联到的对象)——>并发标记(不需要停顿,从GC Root开始对堆中对象进行可达性分析,找到存活对象)——>重新标记(STW很短,修正并发标记期间用户程序运作导致标记产生变动的记录)——>并发清除(不需要停顿)


image.png

优点:STW时间短
缺点:(1)CPU资源敏感,CPU资源不足时,效率会明显降低。
(2)浮动垃圾:因为清理阶段程序还在运行,肯定会产生一些新的垃圾。
(3)会产生空间碎片:标记清除算法会导致产生不连续的空间碎片。
5)G1垃圾回收器 :G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。算法:标记—整理 (humongous) 和复制回收算法(survivor)。 -XX:+UseG1GC

相关文章

网友评论

      本文标题:java高频面试总结(JVM篇)

      本文链接:https://www.haomeiwen.com/subject/bexfpctx.html