JVM
作者:EnjoyMoving
链接:https://www.zhihu.com/question/27339390/answer/204653701
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Java的虚拟机的面试内容主要包括三部分:GC、类加载机制,以及内存。
一个GC部分简单的连环炮。面试官可以先问你什么时候一个对象会被GC?
接着继续问你为什么要在这种时候对象才会被GC?
接着继续问你GC策略都有哪些分类?
你如果说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?
你继续说出来了以后,给你举个实际的场景,让你选择一个GC策略? 你如果选出来了,继续问你,为什么要选择这个策略?下面是关于类加载机制的简单连环炮。首先肯定是先问你Java的类加载器都有哪些?
回答了这些以后,可能会问你每个类加载器都加载哪些类?
说完以后,可能会问你这些类加载之间的父子关系是怎样的?
你在回答的时候可能会提到双亲委派模型,那么可以继续问你什么是双亲委派模型?
你解释完了以后,可能会继续问你,为什么Java的类加载器要使用双亲委派模型?
你回答完以后,可能会继续问你如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?再来一个关于内存的连环炮。首先肯定就是问你JVM内存分为哪几部分,这些部分分别都存储哪些数据?
然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
接着可能会问你,内存的哪些部分会参与GC的回收?
完事以后,可能还会问你Java的内存模型是怎么设计的?
你回答了以后,还会继续问你为什么要这么设计?
问完以后,还可能会让你结合内存模型的设计谈谈volatile关键字的作用?
你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。
JVM是一种用于计算设备的规范,它是一个虚构出来的计算机。
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码)。
Java 虚拟机执行字节码的,把字节码解释成具体平台上的机器指令(机器码)执行。
字节码
.class 文件就是字节码,包含虚拟机指令、程序和数据片段的二进制指令。
为什么叫字节码?因为这种类型的代码以一个字节8bit为最小单位储存。
字节码存储
Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有2种数据类型:无符号数和表。
类加载过程
https://zhuanlan.zhihu.com/p/44670213
Java的虚拟机的面试内容主要包括三部分:GC、类加载机制,以及内存。
GC (garbage collection)
对象产生过程?
什么时候一个对象会被GC?
//www.greatytc.com/p/b1b6eecb6224
//www.greatytc.com/p/4a04fc2a33da
有两种判断方式,一种是引用计数,一种是可达性算法。
- 引用计数存在循环引用,java 没有采用。
- 正向可达的方式
通过Roots对象作为起点进行搜索,搜索走过的路径称为“引用链”,当一个对象到 Roots 没有任何的引用链相连时时,证明此对象不可用
面试常问的问题,Roots对象有哪些?
- 引用栈帧中的本地变量表的所有对象;
- 引用方法区中静态属性的所有对象;
- 引用方法区中常量的所有对象;
- 引用Native方法的所有对象。
当可达性算法标记一个对象将被回收时候,若对象覆盖了finalize() 方法,则会执行 finalize() 方法(若已经执行过,则不执行)。随后对象会被放置到 F-Queue 的队列中,由一个低优先级的线程执行。稍后GC将对F-Queue中的对象进行第二次小规模的标记。若在finalize方法中,对象重新建立链接,则移除 F-Queue 对象。
- 为什么要在这种时候对象才会被GC?