Java虚拟机(JVM,Java Virtual Machine)是Java运行时环境的核心,它是一个能够运行Java字节码的假想计算机,JVM的主要职责包括加载和运行Java字节码,提供运行时环境支持Java程序执行,并管理内存和垃圾回收等。
JVM:java虚拟机,是仿照真实的操作系统进行设计的。真实操作系统中,对于进程的地址空间是进行了区域划分的。JVM也就仿照此,也进行了区域划分的设计。
具体划分(四个核心区域):
Test t = new Test() 代码中new Test()一定在堆中,t 是局部变量就在栈;t 是成员变量就在堆; t 是一个静态成员变量就在元数据区。
类加载的步骤:
2.1. 验证:解析,校验 .class文件的内容是否合法,并把合法内容转成结构化的数据
2.2. 准备:给类对象申请内存空间(此处相当于全0的空间);
2.3. 解析:针对字符串常量,进行初始化;(将 .class文件解析出的字符串常量,放到元数据区,常量池中);
双亲委派模型:描述类加载中,根据全限定类名,找到.class 文件的过程。
类加载器:JVM中专门的模块,负责类加载。JVM默认提供三种类加载器(存在父子关系,1是爷,2是爸,3室儿):
BootstrapClassLoader:找Java标准库的目录ExtensionClassLoader:找Java扩展库的目录ApplicationClassLoader:第三方库和当前项目的目录过程:
ApplicationClassLoader作为入口,然后把加载类的任务交给父亲 ExtensionClassLoader,他又先给他的父亲 BootstrapClassLoader,然后 BootstrapClassLoader找Java标准库范围,找到了就加载,没找到就抛回给儿子 ExtensionClassLoader,同理进行。最后 ApplicationClassLoader都没找到,就抛出异常。
Java中释放内存(主要是针对堆上的对象)的手段。
在c语言中手动申请的内存需要手动释放,而Java引入GC会自动识别,某个内存后续是否还会使用,自动释放。
工作过程:
找到垃圾:
有两个方案,引用计数和可达性分析,Java采取的是可达性分析。
1.1. 每次进行引用赋值的时候都会触发引用计数的修改,当计数为0的时候,这个对象就是垃圾了。
1.2. 缺陷:内存消耗更多,可能出现循环引用(两个对象互相引用,引用变空,但是计数不会变为0)的问题。
2.1. 以代码中的一些特定对象(栈上的局部变量(引用类型的)、常量池引用指向的对象、静态成员(引用类型)),作为遍历的起点。
2.2. 以这些特殊对象为起点,尽可能去遍历,判断某个对象是否能访问到。
2.3. 每一次访问到一个对象,就把这个对象标记成可达,当完成所有的对象,未被标记的就是垃圾。
释放垃圾:


