一、组成部分
1.类加载器
2.执行引擎(解释直接字节码)
3.动态内存管理器
二、JVM内存区域划分
JVM在启动之后会从操作系统申请一大块内存,再针对这个内存划分出一些区域
1.堆(运行性常量池)
new 的对象放在堆上(成员变量),1.8开始运行时常量池放在堆中
2.方法区
加载好的类放在方法区,静态成员
3.栈(JVM栈和本地方法栈)
局部变量
4.程序计数器
存的地址,描述当前线程接下来执行的指令在内存的哪个地方
一个Java进程中,可能包含着多个线程,多个线程之间,共用同一份堆和方法区,但是每个线程有自己的栈和程序计数器。
每个进程有自己的堆,多个进程不公相堆
三、GC都回收哪些?
1.堆:主要回收
2.方法区:GC是回收方法区的,但方法区空间小,数据失去作用概率低(比如房间已经很干净了,但是还要打扫就打扫不出来多少脏东西)
3.栈:不需要回收,栈上的内存何时释放,时机是明确的(线程结束,栈上内存就会释放,栈帧销毁(方法执行完)对应的局部变量被释放)
4.程序计数器:只保存地址,无需回收
四、回收过程
1.回收的基本单位
内存的单位是“字节”, 回收是按照对象的方式回收的
2.回收的基本思路
(1)标记:找出当前对象到底是否需要回收
(2)回收:把“死了”的对象回收回去
(a)引用计数法
记录当前对象,是否被引用指向
(b)可达性分析
需要“图”这样的数据结构遍历图
JVM详解(一)
最新推荐文章于 2024-10-04 16:07:18 发布