Java虚拟机几个点

来源:互联网 发布:双十二淘宝有活动吗 编辑:程序博客网 时间:2024/05/17 23:09

1. 内存模型以及分区,需要详细到每个区放什么。


程序计数器:当前线程所执行的字节码的行号指示器。

Java虚拟机栈:描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息

本地方法栈:为虚拟机使用到的Native方法服务。

堆:存放对象实例。

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。


2. 堆里面的分区:Eden,survival fromsurvivalto,老年代,各自的特点

Eden区的对象都是朝生夕死,发生minor gc的时候会清除eden区和survival区的,把存活的对象移到另一个Survival区,该survial区由老年代保证。当在年轻代中对象经过多次minor gc以后还存活,达到老年代的年纪,就会移动到老年代,还有就是大对象在年轻代无法存储,直接转到老年代,还有可能因为担保而进入老年代的


3. 对象创建方法,对象的内存分配,对象的访问定位

1对象的创建包括三步骤:①当遇到new命令的时候,会在常量池中检查该对象的符号引用是否存在,不存在则进行类的加载,否则执行下一步②分配内存,将将要分配的内存都清零。③虚拟机进行必要的设置,如设置hashcodegc的分代年龄等,此时会执行<init>命令在执行之前所有的字段都为0,执行<init>指令以后,安装程序的意愿进行初始化字段。

2:对象的内存分配:包括对象头,实例数据,对齐填充

①对象头:包括对象的hascodegc分代年龄,锁状态标等。

②实例数据:也就是初始化以后的对象的字段的内容,包括父类中的字段等

③对齐填充:对象的地址是8字节,虚拟机要求对象的大小是对象的整数倍(1倍或者两倍)。因此就会有空白区。

3:对象的访问:hotspan中 是采用对象直接指向对象地址的方式(这样的方式访问比较快)(还有一种方式就是句柄,也就是建一张表维护各个指向各个地址的指针,然后给指针设置一个句柄 (别名),然后引用直接指向这个别名,就可以获得该对象,这种的优势就是,实例对象地址改变了,只要修改句柄池中的指针就可以了,而不用引用本身不会发生 改变)。


4.GC的两种判定方法:引用计数(引用计数算法)与引用链(可达性分析算法)

引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。优点:实现简单,判定效率也很高。缺点:最主要的原因是它很难解决对象之间相互循环引用的问题。

可达性分析算法:基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。 如图3-1所示,对象object 5object 6object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。



5.GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

①标记清除——算法分为标记清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。缺点:效率不大;空间问题,标记清除后产生大量不连续的内存碎片。


②复制算法——将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。 当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。


③标记整理——标记过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。


6. GC收集器有哪些?CMS收集器与G1收集器的特点

①Serial收集器——单线程的收集器


②ParNew收集器——Serial收集器的多线程版本

③Parallel Scavenge收集器——Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。

Serial Old收集器 ——Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。Client模式下的虚拟机使用
Parallel Old收集器——Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法。

CMS收集器——以获取最短回收停顿时间为目标的收集器。

G1收集器——CMS标记清理算法不同,G1从整体来看是基于标记整理算法实现的收集器可预测的停顿:这是G1相对于CMS的另一大优势



(后面五个问题我会在看到后继续补充)


7. Minor GC与Full GC分别在什么时候发生?


8. 几种常用的内存调试工具:jmap、jstack、jconsole

9. 类加载的五个过程:加载、验证、准备、解析、初始化


10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。


11. 分派:静态分派与动态分派。


0 0
原创粉丝点击