一篇文章带你了解JVM常见面试题有哪些
说一下 JVM 的主要组成部分?及其作用?
类加载器(ClassLoader)运行时数据区(Runtime Data Area)执行引擎(Execution Engine)本地库接口(Native Interface)组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码 , 运行时数据区(Runtime Data Area)再把字节码加载到内存中 , 而字节码文件只是 JVM 的一套指令集规范 , 并不能直接交给底层操作系统去执行 , 因此需要特定的命令解析器执行引擎(Execution Engine) , 将字节码翻译成底层系统指令 , 再交由 CPU 去执行 , 而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能说一下 JVM 运行时数据区?详细介绍下每个区域的作用?
【一篇文章带你了解JVM常见面试题有哪些】程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器 , 字节码解析器的工作是通过改变这个计数器的值 , 来选取下一条需要执行的字节码指令 , 分支、循环、跳转、异常处理、线程恢复等基础功能 , 都需要依赖这个计数器来完成;Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的 , 只不过虚拟机栈是服务 Java 方法的 , 而本地方法栈是为虚拟机调用 Native 方法服务的;Java 堆(Java Heap):Java 虚拟机中内存最大的一块 , 是被所有线程共享的 , 几乎所有的对象实例都在这里分配内存;方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据 。 java中都有哪些类加载器
启动类加载器(Bootstrap ClassLoader) , 是虚拟机自身的一部分 , 用来加载Java_HOME/lib/目录中的 , 或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库;扩展类加载器(Extension ClassLoader):负责加载\lib\ext目录或Java. ext. dirs系统变量指定的路径中的所有类库;应用程序类加载器(Application ClassLoader) 。 负责加载用户类路径(classpath)上的指定类库 , 我们可以直接使用这个类加载器 。 一般情况 , 如果我们没有自定义类加载器默认就是用这个加载器 。 ?自定义类加载器:通过继承ClassLoader抽象类 , 实现loadClass方法哪些情况会触发类加载机制
见类加载的时机什么是双亲委派模型?
如果一个类加载器收到了类加载的请求 , 它首先不会自己去加载这个类 , 而是把这个请求委派给父类加载器去完成 , 每一层的类加载器都是如此 , 这样所有的加载请求都会被传送到顶层的启动类加载器中 , 只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时 , 子加载器才会尝试去加载类 。 说一下类装载的执行过程?
类装载分为以下 5 个步骤:?加载:根据查找路径找到相应的 class 文件然后导入;检查:检查加载的 class 文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程 。 符号引用就理解为一个标示 , 而在直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作 。 ?怎么判断对象是否可以被回收?
一般有两种方法来判断:?引用计数器:为每个对象创建一个引用计数 , 有对象引用时计数器 +1 , 引用被释放时计数 -1 , 当计数器为 0 时就可以被回收 。 它有一个缺点不能解决循环引用的问题;可达性分析:从 GC Roots 开始向下搜索 , 搜索所走过的路径称为引用链 。 当一个对象到 GC Roots 没有任何引用链相连时 , 则证明此对象是可以被回收的 。 ?哪些变量可以作为GC Roots
见可作为GC Roots节点的对象?Java 中都有哪些引用类型?
强引用:发生 gc 的时候不会被回收 。 软引用:有用但不是必须的对象 , 在发生内存溢出之前会被回收 。 弱引用:有用但不是必须的对象 , 在下一次GC时会被回收 。 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象 , 用 PhantomReference 实现虚引用 , 虚引用的用途是在 gc 时返回一个通知 。 说一下 JVM 有哪些垃圾回收算法?
标记-清除算法:标记无用对象 , 然后进行清除回收 。 缺点:效率不高 , 无法清除垃圾碎片 。 标记-整理算法:标记无用对象 , 让所有存活的对象都向一端移动 , 然后直接清除掉端边界以外的内存 。 复制算法:按照容量划分二个大小相等的内存区域 , 当一块用完的时候将活着的对象复制到另一块上 , 然后再把已使用的内存空间一次清理掉 。 缺点:内存使用率不高 , 只有原来的一半 。 分代算法:根据对象存活周期的不同将内存划分为几块 , 一般是新生代和老年代 , 新生代基本采用复制算法 , 老年代采用标记整理或标记清楚算法 。
- 占营收|华为值多少钱
- 商品|问道自有品牌,山姆多方博弈
- 公式|?有人把 5G 讲得这么简单明了
- 责令|1336款APP被责令整改,三大问题突出
- 长庚君|向小米公司致歉
- “天河优创”放榜
- 广东移动OTN精智专网,助力千行百业数字化转型
- 快的秒回,慢的等了近一天
- 制药领域|为什么AI制药这么火,为什么是现在?
- 介绍|5分钟介绍各种类型的人工智能技术
