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