JVM
一、内存结构
1.线程私有区域
小结
-
JVM内存模型划分为线程私有区域和共享区域
-
虚拟机栈/本地方法栈负责存放线程执行方法栈帧
-
程序计数器用于记录线程执行指令的位置
-
方法区(元数据区)存储类的元数据信息、静态变量、常量等数据
-
堆(heap)使用
new关键字创建的对象都会进入堆中,堆被划分为新生代和老年代
二、垃圾回收算法
1.标记清除
容易产生内存碎片
2.标记整理
移动成本高
3.复制算法
复制算法会将JVM推分成二等分,如果堆设置的是1g,那使用复制算法的时候堆就会有被划分为两块区域各512m。给对象分配内存的时候总是使用其中的一块来分配,分配满了以后,GC就会进行标记,然后将存活的对象移动到另外一块空白的区域,然后清除掉所有没有存活的对象,这样重复的处理,始终就会有一块空白的区域没有被合理的利用到。
4.小结
- 标记清除速度快,但是会产生内存碎片;
- 标记整理解决了标记清除内存碎片的问题,但是每次都得移动对象,因此成本很高;
- 复制算法没有内存碎片也不需要移动对象,但是导致空间的浪费;
参考文献
图例
