每天十道面试题-20200403

题目

  • 1、JVM三大性能调优参数,JVM 几个重要的参数?
  • 2、JVM调优?
  • 3、JVM内存管理,JVM的常见的垃圾收集器,G1垃圾收集器。GC调优,Minor GC ,Full GC 触发条件?
  • 4、java内存模型?
  • 5、Java垃圾回收机制?
  • 6、jvm怎样 判断一个对象是否可回收,怎样的对象才能作为GC root?
  • 7、OOM说一下?怎么排查?哪些会导致OOM OOM出现在什么时候?
  • 8、什么是Full GC?GC major GC stop the world?
  • 9、描述JVM中一次full gc过程?
  • 10、JVM中类加载机制,类加载过程,什么是双亲委派模型?,类加载器有哪些?

解答

题目一
  • 题干:JVM三大性能调优参数,JVM 几个重要的参数?
  • 分析:
  • 堆主要分为三块【年轻代、老年代、元数据区】堆外还有一块动态调整空间。
    -1、-Xms
    堆的初始值
    2、-Xmx
    堆能达到的最大值
    3、-Xss
    每个线程虚拟机栈的大小【堆栈】

    -Xms:设置初始分配大小,默认为物理内存的“1/64”
    -Xmx:最大分配内存,默认为物理内存的“1/4”
    -Xss规定了每个线程堆栈的大小。一般情况下256K是足够了。影响了此进程中并发线程数大小。
    一般将Xms 和Xmx 设置成一样大小,因为如果设置的不一样,当堆heap不够用的时候,会发生内存抖动,影响程序运行稳定性。

  • 回答:
  • 1、-Xms
    堆的初始值
    2、-Xmx
    堆能达到的最大值
    3、-Xss
    每个线程虚拟机栈的大小【堆栈】。

题目二
  • 题干:JVM调优?
  • 分析:
  • 看这个吧

  • 回答:
  • 见分析.

题目三
  • 题干:JVM内存管理,JVM的常见的垃圾收集器,G1垃圾收集器。GC调优,Minor GC ,Full GC 触发条件?
  • 分析:
  • 参考第二题

  • 回答:
  • 见分析。

题目四
  • 题干:java内存模型?
  • 分析:
  • 在这里插入图片描述在这里插入图片描述两个子系统
    两个系统:1、Class Loader 子系统和 Execution engine(执行引擎)子系统。
    作用:
    Class loader子系统的作用:虚拟机团队是这样描述的“通过一个类的权限定名来获取描述此类的二进制字节流”,这个动作是放到虚拟机外部实现的,以便让应用程序自己决定如何去获取所需要的类。当然我们可以自定义类加载器。
    Execution engine子系统的作用:执行classes中的字节码指令。任何JVM specification实现(JDK)的核心都是Execution engine。
    两个组件
    两个组件:2、Runtime data area(运行时数据区)组件和Native interface(本地接口)组件。
    作用:
    Native interface组件:与native libraries交互说白了就是为本地方法提供服务的,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,容易出现JVM无法控制的native heap OutOfMemory。
    Runtime data area(运行时数据区)组件分为下面五个部分:
    运行时数据区详解:
    第一块:可以看做是当前线程所执行的字节码的行号指示器,如该方法为native的,则PC寄存器中不存储任何信息,如果执行的是Java代码记录的是正在执行的字节码指令的地址。
    第二块:JVM栈JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
    第三块:堆(Heap)它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
    (1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
    (2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配如果TLAB使用掉后创建新的TLAB的时候才会进行加锁提高了效率,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
    (3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
    (4) 所有新创建的Object 都将会存储在新生代Yong Generation中。如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在Eden Space。
    第四块:方法区域(Method Area)也就 Non—heap非堆
    (1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
    (2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
    第五块:运行时常量池(Runtime Constant Pool)存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配(是方法区(Method Area)的一部分)。
    第六块:本地方法堆栈(Native Method Stacks)JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
    总结:
    程序计数器、虚拟机栈、本地方法栈是随着线程的创建而创建的共生共灭;方法区、堆是随着虚拟机的启动而创建的。。

  • 回答:
  • 见分析。

题目五
题目六
  • 题干:jvm怎样 判断一个对象是否可回收,怎样的对象才能作为GC root?
  • 分析:
  • · 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
    · VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。
    · JNI handles,包括global handles和local handles
    · (看情况)所有当前被加载的Java类
    · (看情况)Java类的引用类型静态变量
    · (看情况)Java类的运行时常量池里的引用类型常量(String或Class类型)
    · (看情况)String常量池(StringTable)里的引用

  • 回答:
  • 1- 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
    2-VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。
    3-JNI handles,包括global handles和local handles
    4-(看情况)所有当前被加载的Java类
    5-(看情况)Java类的引用类型静态变量
    6-(看情况)Java类的运行时常量池里的引用类型常量(String或Class类型)
    7-(看情况)String常量池(StringTable)里的引用

题目七
  • 题干:OOM说一下?怎么排查?哪些会导致OOM OOM出现在什么时候?
  • 分析:
  • 参考第六题

  • 回答:
  • 见分析

题目八
  • 题干:什么是Full GC?GC major GC stop the world?
  • 分析:
  • 考察年轻代的回收和整个堆的回收机制,Minor GC可以理解为对于年轻代的回收,FullGC则是收集整个堆的,总的来讲收集垃圾从本质上来讲一定是内存不够用了或者防止内存不够用了。
    STW指的是垃圾回收时造成的JVM的停顿,停顿的时候系统会进入到一个一致性状态,这样有利于更好的标记垃圾。

  • 回答:
  • 见分析。

题目九
  • 题干:描述JVM中一次full gc过程?

  • 分析:

  • FuccGC触发机制:老年代空间不够使用的时候,还有当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。

  • 回答:

  • FuccGC触发机制:老年代空间不够使用的时候,还有当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。

题目十
  • 题干:JVM中类加载机制,类加载过程,什么是双亲委派模型?,类加载器有哪些?
  • 分析:
  • 参考第五题

  • 回答:
  • 见分析。

发布了122 篇原创文章 · 获赞 32 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/YangzaiLeHeHe/article/details/105296225