JVM 内存布局和垃圾回收机制

4. JVM 内存布局和垃圾回收机制

在这里插入图片描述
程序计数器: 类似代码所在的行号指示器
:java 虚拟机每执行一个方法, 都会将这个方法打包成栈针投放都虚拟机栈里, 当执行完打包的栈针里面的方法后, 就将这个栈针进行出栈(如下例子, 现将a 打包成栈针放到栈里, 执行a里面的代码, 当执行到b 方法时, 又将b打包成栈针放到栈里,执行b 里面的方法, b 执行完, 将b栈针执行出栈操作, 之后继续执行a 里面的方法)
public void a (){
//…
b()
//…

}

public void b(){
}

每个方法在被调用时, 就会创建一个栈针, 每个方法从调用直至执行完成的过程, 就对应着一个栈针, 在虚拟机栈中入栈到出栈的过程

:是java 虚拟机所管理的内存中最大的一块, java 堆是被所有线程共享的一块内存区域, 对象实例在这里分配内存。 是垃圾收集器(GC)管理的主要区域

方法区:存储已被虚拟机加载的类信息(继承了那些父类, 实现了哪些接口等), 常量,静态变量,及时编译器编译后的代码等数据,, (JDK 1.6 以前)运行时常量池是方法区的一部分.

直接内存: 并不是虚拟机运行时数据区的一部分, 也不是java 虚拟机规范中定义的你存区域。

jdk 1.6,运行时常量在 方法区, 1.7 后放到了堆了。 1.8 取消了方法区, 从内存布局中移除, 取而代之的是 元空间(本地内存)
在这里插入图片描述

垃圾回收机制

  1. 将可回收的内存标记出来之后回收。导致内存碎片, 内存不连续

在这里插入图片描述
2. 复制算法
将内存分为2 部分, 将存活的对象已到右边, 将左边需呀回收的内存一次性回收。
优点, 右边内存连续。 缺点:空降浪费,在任何时候都有一半的空间是美誉使用上的
在这里插入图片描述
3. 标记整理算法
在回收前, 将可回收的内存进行标记, 将存活的内存按照某种顺序在区域里放好,把需要回收的内存一次性回收
优点:内存很规整
缺点:内存全区域块的移动对性能有影响
在这里插入图片描述

4. 分代收集

内存二级分法(新生代 & 老年代)
大部分内存在使用完都可以立即回收的–》新生代 都采用复制算法
在新生代中活过了一定次数, 就会升级成老年代, 有可能采用标记清除算法,也有可能是标记整理算发
回收垃圾的线程可以使一个也可以使多个, 一个是串行, 多个是并行。

jdk 最新版本G1:G1将内存区域划分成更小的块, 划分的更详细, 既可存新生代, 也可存老年代

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41572697/article/details/89856910
今日推荐