java虚拟机常见面试题整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hzt_fighting_up/article/details/78473659

-1.JVM的内存模型
1)程序计数器:当前线程所执行的字节码的行号执行器。再多线程上下文切换中将非常有用。
上下文切换:保存到在加载的过程。可以理解为你看书看到第几页以后不看了,然后折了一下作为标志,下次就从这里开始看
2)java虚拟机栈:我们常说的栈就是java虚拟机栈,它是方法执行的内存模型。方法在执行时会创建一个栈帧,每个方法从调用到执行完成的过程,对应的栈帧的入栈和出栈。
栈帧:存储局部变量表、操作数栈、动态链接等。
局部变量表:存储基本类型、对象引用、returnAddress类型(指向字节码的指令)
3)本地方法栈:一些native方法吧
4)java堆:线程共享的一块内存区域,java堆是垃圾收集器管理的主要区域
5)方法区:类信息、常量、静态变量、即时编译器编译以后的代码的存储
6)运行时常量池:class文件中常量池的保存地方,主要保存的是类的版本、字段、方法、接口等描述信息
7)直接内存:
-2.垃圾回收的时候如何判断一个对象需要回收
判断一个对象是否需要回收,即判断是否存活,有两种算法。jvm采用的是第二种算法
1)引用计数算法
假设每个对象都有一个引入计数器,每当引用一个对象进行加1操作,不再引用时计数器减1。jvm没有使用这个算法,因为它存在对象之间互相引用的问题(主要是堆里面互相引用,而在栈里已经没有引用指向它了)

2)可达性分析算法
当一个对象到GCRoots不可达时,即没有引用链,则该对象是可回收的

继续追问:可以作为GC ROOTs的对象:
1)虚拟机栈(栈帧中的本地变量表)中引用的对象
2)方法区中类静态属性引用的对象
3)方法区中常量引用对象
4)本地方法栈中引用的对象

猜你喜欢

转载自blog.csdn.net/Hzt_fighting_up/article/details/78473659