zoukankan      html  css  js  c++  java
  • jvm面试题

     1、虚拟机的类加载机制

        1.1、什么是虚拟机的类加载机制

          在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、准备、解析、初始化,使这些数据          最 终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制。

         从二进制字节流从加载到内存,到卸载出内存过程中有7个生命周期阶段,而类加载机制包括前五个阶段

    如下图所示:

    其中,加载、验证、准备、初始化、卸载的开始顺序是确定的,注意,只是按顺序开始,进行与结束的顺序并不一定。解析阶段可能在初始化之后开始。

     2、 如何实现JAVA 类的动态加载

    3、述一下JVM加载CLASS文件的原理机制

    4、谈谈JAVA内存模型

         java虚拟机规范中试图去定义一种方式,来屏蔽掉各种硬件和操作系统内存访问差异,来显现java程序在不同的平台都能够达到一致的内存访问效果,java内存主要目标是定义内存中各个变量的访问规则,规定所有变量都存储在主内存,每个线程都要自己工作内存(高速缓存,与主存是两个东西),对变量的所有操作都要在线程自己的工作内存中,操作完再放回到主内存中

    5、如何分析JVM的异常

    6、谈一下你GC?

    GC指的是垃圾收集,GC需要完成三件事情

    • 那些内存需要回收
    • 什么时候回收
    • 如何回收

    引用计数法算法

    •    jvm给对象中添加一个 引用计数 器,每当有一个地方引用对象时,计数器就加1,当引用失效时,计数器就减1,计数器为0的对象,就说明需要回收

    可达性分析算法

    • 实际中jvm是通过可达性分析算法来判断哪些对象需要被回收的,这个算法基本的思路是 GC Roots的对象作为起始点,从在这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到
    • GC Ronts对象没有任何引用链相连时,表示对象不可达。

    (1)    标记-清除算法

                这个算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,然后统一回收被 标记的对象,这个算法有两个问题,首先是效率问题,另一个是空间问题,标记清除之后,会产生大量的内存

               碎片,空间碎片太多,以后在程序运行的过程,如果需要分配较大对象时,无法找到足够的连续内存而不得不触发另一次GC操作

    (2)    复制算法

        这个算法是解决标记-清除算法带来的空间太多碎片问题,将内存按容量划分为大小相等的两块 ,每次只使用其中的一块,当前块要用完时,就将还存活 的 对象,移动到另外一块上面,然后将当前块的内存空间一次清理掉。现在商业虚拟机都是采用复制算法来处理新生代,不过容量划分比例不是1:1,而是将内存划分为一块较大的eden空间和两块小的survivor(幸存者区),每次使用Eden和其中一块幸存者区间,当GC回收时,将eden和一块survivor中存活的对象,移动到另外一块Survivor空间上,最后清理掉eden区和刚才用过的幸存者区,像hotspot虚拟机eden区和survivor的比例是8:1。

    (3)    标记整理算法

             复制收集算法在对象存活率较高时要进行较多复制操作,效率会变低,有人就提出标记整理算法,标记整理不去划分内存空间,分为三个阶段,首先是把一块空间中可回收,存活的对象给标记出来,           然后把存存活的对象移动到当前块空间内的一端,然后清除掉边界以外的对象。

    (4)    分代收集

         当前商业虚拟机的垃圾收集都是采用分带收集,这种算法不是什么新的 思想,只是根据对象的存活周期,将不同的内存划分为几块,比如hotspot虚拟机,将java堆分为eden sapce(伊甸园) 、survivor space(幸存者区)、tenured Gen(老年代),伊甸园和幸存者区采用复制算法,老年代采用标记整理算法。

    7、两个对象相互引用,会不会被GC?

    首先两个对象相互引用,和会不会被GC没有直接关系。jvm是采用对象到GC Roots可达性来决定是否会被GC回收的。

    8、什么是双亲委派模型?

    ClassLoader的结构中,还有一个重要的字段parent,它也是一个ClassLoader的实例,这个字段表示的ClassLoader也成为这个ClassLoader的双亲,自上而下,有启动类加载器,拓展类 加载器,应用加载器,自定义类加载器,jvm加载类是,默认会使用双亲委派模式.如果一个类加载器收到类加载请求,系统会判断当前类是否已经被加载,如果被加载,就会直接返回可用的类,否则就会先请求自己父类去加载,如果双亲加载失败,则会自己加载,每一个层次的类在加载器的都是如此。

    9、java中的内存溢出是如何造成的?

    https://www.cnblogs.com/lcword/p/5857909.html

    10、HotSpot jvm包含哪些垃圾收集器?

    • Serial收集器  (单线程新生代收集器,使用复制算法)
    • parNew收集器(多线程并行新生代收集器,使用复制算法)
    • parallel Scavenge收集器 (多线程并行新生代收集器,使用复制算法)
    • Serial Old收集器(Serial收集器老年代版本单线程老年代收集器,使用标记-整理算法)
    • parallel Old收集器(parallel Scavenge收集器老年代版本,采用标记-整理算法)
    • CMS收集器(Concurrent Mark Sweep,多线程并发收集器,低停顿,采用标记-清除)

    参考:http://blog.csdn.net/wfh6732/article/details/57490195?utm_source=itdadao&utm_medium=referral

    11、CMS收集器的标记流程是什么?

    1. 初始标记
    2. 并发标记
    3. 重新标记
    4. 并发清除

    12、jvm 什么情况下会触发minor gc?

    当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如,堆内存分为年轻代 又分为 eden 区和 survivor 区,当eden满时 ,就会触发minor GC

    13、jvm什么情况下回触发full gc?

    首先理一下概念,CMS和Parnew只是一种垃圾回收算法,Parnew作用在新生代,CMS则作用在老年代。至于是在什么情况会发生Full GC?
    根据经验来看存在以下几种情况什么发生FullGC:
    1. 老年代的使用率达到阈值(通过JVM参数:CMSInitiatingOccupancyFraction设定,默认为92%)
    2、永久代的使用率到达阈值CMSInitiatingPermOccupancyFraction设定,默认为92%)
    3、当新生代对象沉淀到老年代时担保失败

    https://blog.csdn.net/scugxl/article/details/50935863

    14、jdk1.7 永久代和jdk1.8元空间的区别?

    http://www.cnblogs.com/paddix/p/5309550.html

  • 相关阅读:
    学习设计模式之中介者模式
    学习设计模式之责任链模式
    学习设计模式之命令模式
    学习设计模式之桥接模式
    学习设计模式之单例模式
    学习设计模式之迭代器模式
    Spring 源码学习——注册 BeanDefinition
    Html.DropDownListFor
    Home vs2013
    Jquery 操作页面中iframe自动跟随窗口大小变化,而页面不出现滚动条,只在iframe内部出滚动条
  • 原文地址:https://www.cnblogs.com/520playboy/p/7773003.html
Copyright © 2011-2022 走看看