一、Java内存分配
Java将一整块Java内存划分为几个部分:
方法区
存储的是Java的类信息和常量,静态变量等,比如public final static 这样的常量和静态变量等,这个区域是所有线程都共享的
虚拟机栈
储存的是局部变量表和操作树栈等,为Java方法来服务的
本地方法栈
为native方法来服务的
堆
内存中最大的一块区域,被所有线程共享,每个对象的分配内存都是在堆上面分配的,虚拟机栈中分配的只是引入,指向堆中真正的对象,垃圾回收器GC 主要作用的区域,内存泄漏也是发生在堆当中的
程序计数器
当前线程执行的方法执行到了第几行
二、Java内存回收算法
标记-清除算法
- 标记出所有要回收的对象
- 统一回收所有被标记的对象
- 特点:
- 效率不高
- 产生大量不连续内存碎片
复制算法
- 将内存分为大小相等的两块
- 一块内存用完之后复制存活对象到另一块
- 特点
- 实现简单,运行高效
- 浪费一半空间,代价大
标记整理算法
- 标记过程与标记清除算法一样
- 存活对象往一端移动
- 清理其余内存
- 特点:
- 避免标记-清理导致的内存碎片
- 避免复制算法的空间浪费
分代收集算法
- 结合多种收集算法优势
- 新生代对象存活率低,采用复制算法
- 老年代对象存活率高,采用标记-整理算法