Jvm

Jvm的内存布局和垃圾回收机制

Posted by 杨一 on 2020-03-26

内存布局

运行时数据区

虚拟机

  1. 程序计数器:用来控制代码运行行数。
  2. Java 虚拟机栈:每个线程运行方法(A调用B)时,先把A方法放入到栈底,然后加载B方法,B方法放在A方法栈帧上,执行完B方法,弹出栈,随后A弹出栈。对应着一个栈帧出栈入栈的过程。
  3. Java堆:是Java虚拟机管理的最大的内存区,是所有线程可共享的,对象实例在这里被分配内存,是垃圾收集器(GC)管理的主要区域。
  4. 方法区:保存已被虚拟机加载的类信息(实现的接口、继承的父类等等)、常量、静态变量即时编译器编译后的代码,运行时常量池。
  5. 直接内存:不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域。大部分是Java的io操作使用。
  6. 内存布局变化

垃圾回收机制

1. 标记算法,容易出现碎片。

2. 复制算法,由于每次只用一半,总是有一半的内存空间浪费。

3. 标记-整理算法,存在内存块的移动,对性能有一些影响。

4.分代收集,大部分使用完后的对象都可以回收,新生代采用复制算法,年老代采用标记清除算法,回收线程可以是多个,