java面试基础篇之JVM(更新中...)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37014990/article/details/81635004
  • 该整理有markdown文件,需要的联系邮箱[email protected]

  • 讲一下JVM

    定义:java虚拟机是能够提供java程序的运行环境,屏蔽了与具体操作系统平台相关的信息,java程序只需要生成字节码便可以在不同的平台借助虚拟机运行。即借助虚拟机,字节码可跨平台。

    系统架构:类加载子系统、运行时数据区、直接内存、垃圾回收系统、执行引擎。

  • 讲一下JVM的分代回收以及具体算法

    分代回收意义:分代即在JVM运行时数据区中的java堆中,按照对象的生命周期分为新生代老年代。所以,按照生命周期和在堆中的位置不同,在GC的时候应当采取不同的回收策略,可以提高回收效率。

    具体算法:新生代存活对象较少,一般使用复制算法。老年代存活对象较多,一般使用标志清除法标志压缩法

  • 讲一下JVM垃圾收集器,G1和CMS区别

    堆空间上分配的不同

    1. CMS收集器:将堆空间分成Eden、Servivor、old,并且他们是固定大小,JVM启动的时候设定且不能改变。

    2. G1收集器:将堆空间分成多个大小相同的Region区域,逻辑上分Eden/Servivor、old,且大小是可变的,每次会根据GC的信息做出调整。

    压缩策略的不同

    1. CMS:存在minor GC、full GC,且CMS的youngGC依赖并行GC(ParNew)去完成,只有老年代使用CMS GC去完成。

    2. G1:区分三种策略,minor Gc、mixed GC 、 full GC, 而minexGC会回收整个yong区,回收部分old区。

    可预测停顿模型:CMS和G1都是最求最低停顿时间,而CMS可以建立可可预测的停顿时间模型,能让使用者明确指定一段长度为M毫秒的时间片段内,消耗在垃圾回收上的时间不超过N毫秒。

  • 讲一下一个变量从产生到结束所经历的过程,讲一下字符串常量的过程?

    变量类型:局部变量(栈帧)、常量、静态变量

    局部变量:局部变量随着方法的调用产生和结束,在调用方法的时候回创建栈帧,而栈帧里存在局部变量表,当方法调用结束的时候栈帧销毁,局部变量随着销毁。

    常量/静态变量:一般存放在方法区,而方法区的周期与堆相似,声明并赋值后直接放入常量池,之后通过可达性分析判断常量是否存在引用链,如不存在移除常量池。

  • 双亲委派模型的好处(2018.9.3)

    1. 保证JVM运行环境中只有一份字节码文件,即保证不会重复加载一个类。

    2. 鉴于情况1,增加程序的安全性,即黑客无法通过重写已经有的类,进行攻击。

    3. JAVA的类随着它的类加载器一起具备了带有优先级的层级关系。

      • 比如,Object类存在在rt.jar中。无论哪一个类加载器要加载这个类,最终都是委派给Bootstrap启动类加载器加载,所以Object在程序的各种类加载器的环境中都是同一个类。

  • Java堆中对象创建过程

    1. 流程:类加载、内存分配、初始化、设置对象头、INIT方法(构造函数)

    2. 类加载,需要遇到关键字new触发。当虚拟机遇到该关键字的时候,定位到方法区中的常量池,在常量池中寻找new对应类的符号引用,并检查该符号引用对应的类是否被类加载系统加载。加载成功进行内存分配,否则继续加载。

    3. 内存分配,即JVM在堆中进行对象内存分配,对象所需要的内存大小,在类加载过程中就已确定。

    4. 初始化,即将内存空间初始化为默认值,包括对象字段。

    5. 设置对象头(Object Head)。

    6. 执行INIT方法,即构造函数。

  • 对象头(Head) :分为两部分

    第一,用于存储对象自身运行时的数据,hash码、GC分代年龄、锁状态标 志、线程持有的锁。

    第二,是类型指针,即对象指向它的元数据的指针,JVM通过该指针确定这个对象是哪个类的实例

猜你喜欢

转载自blog.csdn.net/qq_37014990/article/details/81635004