JVM探究
双亲委派机制
1.类加载器收到类加载的请求 APP
2.将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3.启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,通知子类加载器进行加载。
栈:数据结构
程序 = 数据结构 + 算法 : 持续学习
程序 = 框架 + 业务逻辑 : 吃饭用的
栈:先进后出,后进先出 桶的样子
队列:先进先出
为什么main方法先执行,后结束。
栈:栈内存,主管程序的运行,生命周期和线程同步;
程序结束,栈内存也就是释放,对于栈来说,不存在垃圾回收问题。
一旦线程结束,栈就over!
栈:8大基本类型 + 对象引用 +实例的方法
堆 + 栈 +方法区的交互关系
堆:一个JVM只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取了类文件后,一般会把类,方法,常量,变量,所有引用类型的真实对象保存到堆中。
堆内存中还要细分为三个区域:
- 新生区 (伊甸园区,幸存者0区,幸存者1区)
- 养老区
- 永久区 (元空间) 逻辑上存在,物理上不存在。
伊甸园区满了之后就会触发轻GC,把对象留存到幸存者区或者清除。新生区满了之后会触发重GC,
清除新生区,把存活下来的保存到养老区。(默认经历15次清理之后会去养老区)
永久区:常驻内存的,用来存放jdk自身携带的Class对象。Interface元数据,存储的是java运行时的一些环境或类信息。
不存在垃圾回收,关闭VM虚拟机就会释放这个区域的内存。
- jdk1.6之前 永久代,常量池在方法区
- jdk1.7 永久代,但是慢慢的退化了,去永久代,常量池在堆中
- jdk1.8之后 无永久代,常量池在元空间