既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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 是在方法区里
3. JVM 类加载机制
3.1 类加载过程
这是类加载的过程.
① 加载
Java虚拟机需要完成以下三件事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
② 验证
验证刚刚的Class文件是不是一个合法的文件.
验证选项:
- 文件格式验证
- 字节码验证
- 符号引用验证…
③ 准备
为了类对象中的一些成员分配内存空间(静态变量),并且进行一个初步的初始化(把初始的空间设为全0).
public static int value = 333
它初始化 value 的值为0,并非333
④ 解析
Class文件中就会涉及一些字符串常量.
解析就是把这个类加载过程中,需要把这些字符串常量给替换成当前JVM内部已经持有的字符串常量的地址.
⑤ 初始化
这个阶段就是真正开始堆静态变量进行初始化.同时也会执行static代码块
3.2 双亲委派模型
在 JVM 中, 有三个类加载器(三个特殊的对象) 来负责进行这里的找文件的操作.
这里如果一个类收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求给委派给父亲加载器.
BootStrap
是爷爷,ExtClassLoader
是父亲,AppClassLoader
是儿子.
当收到一个类加载请求,首先从AppClassLoader
开始查找,在查找之前会把这个请求委派给父亲ExtClassLoader
,在ExtClassLoader
开始查找之前,会把这个请求委派给父亲BootStrap
.BootStrap
没有父亲,就自己查找.
如果BootStrap
找到了,就直接加载.如果没有找到,就回到孩子继续查找.
如果ExtClassLoader
找到了,就直接加载.如果没有找到,就回到孩子继续查找
如果AppClassLoader
找到了,就直接加载.如果没有找到,就抛出 ClassNotFoundException.
4. JVM 垃圾回收
4.1 什么是垃圾回收
垃圾回收(GarbageCollection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
4.2 Java 的垃圾回收要回收的内存是哪些
由于栈和程序计数器的内存都是和具体的线程绑定在一起,代码块结束/线程结束,内存就自动释放了.
方法区和堆是垃圾回收机制要释放的内容.方法区进行垃圾回收比较特殊不考虑.
这里讨论的垃圾回收主要指的是堆上内存的回收.
4.3 回收堆上的内存,具体是回收什么
堆上的内存分为三类:
- 完全要使用
- 完全不使用
- 一半要使用, 一半不使用
Java 中的垃圾回收, 是以"对象"为基本单位的.一个对象不会存在被回收一半的情况.
4.4 垃圾回收是怎么回收的
垃圾回收就是 先找到垃圾,然后再回收垃圾
垃圾: 就是再也不会被使用到的对象
4.5 判断垃圾的算法
a) 引用计数算法
就相当于在对象里面增加一个引用计数器,
每当有一个地方引用它的时候,计数器就+1.
每当这个引用失效时,计数器就-1
优点 :
规则简单,实现方便,比较高效
缺点 :
- 空间利用率比较低(浪费空间)
如果你一个对象很大,在程序中数目不多.此时引用计数就没有什么影响(本来一个对象就很大)
如果你一个对象很小,在程序中数目很多,此时引用计数空间开销就很大(本来一个和对象很小,每个对象加个int) - 存在循环引用的问题
b) 可达性分析算法
从一组初始的位置出发, 向下进行深度遍历, 把所有能够访问到的对象都标记为 “可达”.对应的, 不可达的对象就是垃圾.
JVM 中采取的方案. JVM 存在一个/一组线程,周期性的进行遍历,不断的找出这些不可达的对象,由 JVM 回收.
把可达性分析, 初始位置为 “GC Root”
可作为GC Roots的对象包含下面几种:
- 栈上的局部变量中的引用
- 常量池里面的引用执行的对象
- 方法区中, 引用类型的静态成员变量
Java的引用也可以被判定对象的生死了
四种引用:
- 强引用: 既能访问对象, 也能决定对象的生死
- 软引用: 能访问对象,但是只能一定程度的决定对象的生死
- 弱引用: 能访问对象,不能决定对象的生死
- 虚引用: 既不能找到对象, 也不能决定对象的生死.只能在对象临被回收前, 进行一些善后工作.
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
715816111716)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!