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垃圾回收算法?

引用计数法

复制算法

标记清除

标记压缩

posted @ 2021-07-05 23:58  一柒微笑  阅读(40)  评论(0编辑  收藏  举报