美文网首页
jvm面试准备

jvm面试准备

作者: Thor_92 | 来源:发表于2019-11-22 09:35 被阅读0次

    Java很强大,原因有很多。其中之一就是“write once, run anywhere”,而这一切都离不开jvm。

    jvm是java虚拟机,主要分为三个部分:类加载器,执行引擎,运行时数据区。

    我们在面试中被问到的最多的就是运行时数据区。

    运行时数据区主要分为五个部分:虚拟机栈,本地方法栈,堆,方法区,程序计数器。其中本地方法栈、虚拟机栈、程序计数器是线程私有的,方法区和堆是线程共享的。

    1 虚拟机栈

    虚拟机栈是由一个个栈桢组成,程序中的每一个方法在运行的时候都会被压入虚拟机栈,也可以看成每一个运行的方法就是一个栈桢。在栈桢中包含四个组成部分,局部变量表、动态链接、操作数栈、方法出口。每一个方法执行完之后就会立即出栈。因此栈不存在垃圾回收,但是栈有深度,可能出栈stackOverFlow。

    2 本地方法栈

    本地方法栈与虚拟机栈类似。

    3 程序计数器

    在我们的源码被编译为class去执行的时候,我们的代码执行顺序就是通过程序计数器来保证的。

    4 方法区

    方法区主要用来存储运行时的常量池、静态变量、类信息、JIT编译后的代码等数据。

    5 堆

    堆中主要分为两个区域,新生代和老年代。

    新生代又分为三个区域,eden、survovir from、survivor to。

    第一次gc

    eden主要用于生成新对象,在该区域满了之后,会进行一次minor gc,回收掉无用的对象,剩下的存放到from中。

    第二次gc

    等到下次eden满了触发gc的时候,把eden中存活的对象复制到to中,from中存活的对象判断其age是否到了阈值,如果到了就存放到老年代,如果没到就把对象复制到to中并且对象age+1,保证eden和from是空的状态。如果此时to也满了,会把to的对象复制到老年代中。

    第三次gc

    过了一段时间,eden又满了,执行了gc,这时候把eden中存活的对象又放入from中。

    来来回回执行上三个步骤,直到老年代满了,会触发major gc(full gc)。

    相关文章

      网友评论

          本文标题:jvm面试准备

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