JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机.
虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统.
堆 : 放的是 new 的对象
方法区 : 放的是 类对象
栈 : 放的是局部变量
程序计数器 : 放了一个内存地址
注意事项:
示例 :
class Student{
public int Id;
}
public class Test {
Student student2 = new Student();
static Student student3 = new Student();
public static void main(String[] args) {
Student student1 = new Student();
}
}
student1 是在栈里
student2 是在堆里
student3 是在方法区里
这是类加载的过程.
Java虚拟机需要完成以下三件事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证刚刚的Class文件是不是一个合法的文件.
验证选项:
为了类对象中的一些成员分配内存空间(静态变量),并且进行一个初步的初始化(把初始的空间设为全0).public static int value = 333
它初始化 value 的值为0,并非333
Class文件中就会涉及一些字符串常量.
解析就是把这个类加载过程中,需要把这些字符串常量给替换成当前JVM内部已经持有的字符串常量的地址.
这个阶段就是真正开始堆静态变量进行初始化.同时也会执行static代码块
在 JVM 中, 有三个类加载器(三个特殊的对象) 来负责进行这里的找文件的操作.
这里如果一个类收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求给委派给父亲加载器.BootStrap
是爷爷,ExtClassLoader
是父亲,AppClassLoader
是儿子.
当收到一个类加载请求,首先从 AppClassLoader
开始查找,在查找之前会把这个请求委派给父亲ExtClassLoader
,在 ExtClassLoader
开始查找之前,会把这个请求委派给父亲 BootStrap
.BootStrap
没有父亲,就自己查找.
如果BootStrap
找到了,就直接加载.如果没有找到,就回到孩子继续查找.
如果ExtClassLoader
找到了,就直接加载.如果没有找到,就回到孩子继续查找
如果AppClassLoader
找到了,就直接加载.如果没有找到,就抛出 ClassNotFoundException.
垃圾回收(GarbageCollection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
由于栈和程序计数器的内存都是和具体的线程绑定在一起,代码块结束/线程结束,内存就自动释放了.
方法区和堆是垃圾回收机制要释放的内容.方法区进行垃圾回收比较特殊不考虑.
这里讨论的垃圾回收主要指的是堆上内存的回收.
堆上的内存分为三类:
Java 中的垃圾回收, 是以"对象"为基本单位的.一个对象不会存在被回收一半的情况.
垃圾回收就是 先找到垃圾,然后再回收垃圾
垃圾: 就是再也不会被使用到的对象
就相当于在对象里面增加一个引用计数器,
每当有一个地方引用它的时候,计数器就+1.
每当这个引用失效时,计数器就-1
优点 :
规则简单,实现方便,比较高效
缺点 :
从一组初始的位置出发, 向下进行深度遍历, 把所有能够访问到的对象都标记为 “可达”.对应的, 不可达的对象就是垃圾.
JVM 中采取的方案. JVM 存在一个/一组线程,周期性的进行遍历,不断的找出这些不可达的对象,由 JVM 回收.
把可达性分析, 初始位置为 “GC Root”
可作为GC Roots的对象包含下面几种:
Java的引用也可以被判定对象的生死了
四种引用:
该算法分为 “标记” 和 “清除” 两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象.
缺点 :
将内存按容量划分为大小相等的两块, 每次只使用一块.当这块内存需要进行垃圾回收时,会将此区域还存活的对象复制到另一块上.
缺点 :
跟标记-清除一样,只不过后续让存活的对象都向一段搬运
缺点 :
在这个搬运过程中,也是一个很大的开销,这个开销比复制算法里面复制对象的开销甚至更大
在 JVM 中, 进行垃圾回收扫描也是周期性的,这个对象每次经历了一个扫描周期, 就认为"长了一岁"
根据这个对象的年龄来堆整个内存进行分类.年龄短的对象放在一起,年龄长的对象放在一起.不同的年龄的对象,就可以采取不同的垃圾回收算法来进行处理了.
分代回收的过程:
特殊情况,如果这个对象特别大,就会直接进入老年代.
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://wangzhi430.blog.csdn.net/article/details/124602345
内容来源于网络,如有侵权,请联系作者删除!