JVMJava学习笔记技术干货

JVM问题及解答

2019-02-07  本文已影响85人  AI贺贺

常见JVM问题

  1. JVM内存模型,GC机制和原理。
    注意JVM内存模型与Java内存模型(JMM)不是同一个东西。
    JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)


    image
image

参考:多线程之Java内存模型(JMM)(一)

  1. GC分哪两种,Minor GC 和Full GC有什么区别?什么时候会触发Full GC?分别采用什么算法?

Minor GC采用复制算法,将Eden区的对象复制到Suvivor空间,然后进行清除
Full Gc采用的是标记-压缩算法,让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。

参考:Java的垃圾回收机制-垃圾收集算法(一)

  1. JVM里的有几种classloader,为什么会有多种?
    JDK中默认情况下有三种,如下图


    image

如果一个类收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委派给父类来实现,每一个层次的类加载器都是这样,因此所有的类加载请求都会最终传送到启动类加载器,只有当父类加载器无法完成这个加载请求,子类加载器才会自己尝试加载。

好处:避免内存中出现同样的字节码。可以很好的解决各个类加载器的基础类统一问题。

参考:JVM是如何加载类的?

  1. 什么情况下我们需要破坏双亲委派模型?
    热替换,热部署。OSGI是Java业界广泛认可的模块化标准,而OSGI模块化热部署的关键是它自定义的类加载器。每一个模块都有一个自己的类加载器,当需要更换一个 Bundle(包) 时,Bundle连同类加载器一同替换实现代码热部署。

弄懂了OSGi的精髓,就可以算是掌握了类加载器的精髓

参考:JVM是如何加载类的?

  1. 常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
    主要调节吞吐量和响应时间:
    参考:
    记一次JVM调优
    如何解决OutOfMemoryError

  2. JVM class文件结构是如何解析的;

  3. 可见性,重排序,final关键字
    可见性是指一个线程修改某个共享变量的值的时候,其它线程能立刻得知。
    重排序是底层做的优化,有些代码会在机器层面上提前执行,从而出现不正常的结果
    final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

参考:深入理解final关键字

  1. Java对象模型
    每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了两部分信息,对象头以及元数据。对象头中有一些运行时数据,其中就包括和多线程相关的锁的信息。元数据其实维护的是指针,指向的是对象所属的类的instanceKlass。

这个内容比较多,需要深入理解

参考:Java对象模型

  1. oop-klass

  2. 对象存活判定
    可达性分析算法:可达性分析,通过一系列"GC Roots"的对象作为起始点,往下走,一个对象到GC roots没有任何引用的时候,则证明对象是不可用的
    可作为GC roots的对象:

  1. Java的引用类型

参考:Java Primitive type与References type

最后

本文持续更新...

上一篇 下一篇

猜你喜欢

热点阅读