JVM——Java虚拟机
1.JMV架构图:
2.什么是类装载器?
ClassLoader负责加载class文件,class文件在文件开头有特定的文件标识(cafe babe),将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。ClassLoader只负责class文件的加载,至于是否可以运行则有Execution Engine执行引擎决定
3.有哪几种类加载器?
Bootstrap ClassLoader:启动类加载器(C++),$JAVAHOME/jre/lib/rt.jar
Extension ClassLoader:扩展类加载器(Java),$JAVAHOME/jre/lib/ext/*.jar
App ClassLoader:应用程序类加载器(也叫系统类加载器),加载当前应用的classpath的所有类
4.什么是双亲委派机制?
主要目的:保证你的代码不会污染源码
优先从Bootstrap中去加载,再从Extension中去加载,最后再从App中去加载。
5.沙箱安全机制?
6.本地接口Native Method
7.PC寄存器
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。如果执行Native方法,那这个计数器是空的。用以完成分支,循环,跳转,异常处理,线程恢复等基础功能,不会发生OOM(OutOfMemory)错误
8.方法区
线程共享的运行时内存区域,它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool),字段和方法数据,构造函数和普通方法的字节码内容。不同虚拟机的实现是不一样的,例如永久代(PermGen space)和元空间(Metaspace)。实例变量存在堆内存中,和方法区无关。
9.栈Stack
栈管运行,堆管存储
栈也叫栈内存,主管Java程序的运行,是在线程创建的时候创建的,它的生命周期是跟随线程的生命周期,线程结束,栈内存也就释放了,所以不存在垃圾回收的问题。栈内存是线程私有的。8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配
10.堆,栈,方法区的交互关系?
11.堆
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行、
12.GC垃圾回收算法?
引用计数法
复制算法
标记清除
标记压缩