您的位置:首页 > 其它

关于JVM内存回收 - 学习总结(基础)

2017-04-06 09:19 246 查看
1:JVM内存结构
1)程序计数器 - 内存空间直接划分在CPU -- 线程私有 -- 执行下一条指令  线程等待时作用较大

2)JVM虚拟机栈 - 堆栈中的栈,方法被执行时会产生一个栈帧用于存放局部变量表、动态链接、操作数、方法出口 等类信息 -- 线程私有

3)本地方法栈 - 处理Java本地方法 -- 与Java虚拟机的栈是同一个

4)堆 - Java性能优化的内存区域 -- 所有对象的实例一节数组都在堆上分配的

5)方法区 - 线程共享的内存区域,存储已经被JVM加载的类信息、常量、静态变量等 -- Java规范将方法区描述为堆的一个逻辑部分,该区域在java8已被删除,取而代之的是元空间

--- 在JDK1.4中新加入NIO类 - 直接内存区 --基于通道和I/O缓冲区的实现

2:垃圾回收算法

1)引用计数算法 - 引用+1 撤离-1 判断=0时间进行回收判断

2)根搜索算法 - 是否与GC Roots有联系 - (栈帧/静态属性引用的对象/常量引用的对象本地方法栈中JNI引用的对象  这些作为GC Roots)

3:四种引用

1)强引用 - 不进行回收

2)软引用 - 根据内存空间判断是否回收

3)弱引用 - 需要回收

4)虚引用 - 因占用内存少 忽略回收

4:三种回收情况

1)该类的所有实例对象都已经被回收

2)加载该类的ClassLoader已经被回收 -- 关于 关于加载类ClassLoader

3)该类的反射Class对象在任何地方没有被引用

5:常见GC算法

1)标记-清除算法 - 效率低,产生的内存碎片较多

2)复制算法 - 将不需要回收的内存复制到一块空闲的内存空间

3)标记 - 整理算法 - 标记需要清理的内存,将不需要回收的内存重新分配空间

6:常见垃圾回收器

1)串行GC - 垃圾回收单线程 -- 回收时客户端会有停顿现象,时间不会太长

2)并行回收GC - 多线程 -- 提高了效率

3)并行GC -
整个扫描和复制过程采用多线程的方式来进行 -- server级别默认采用的GC方式

4)CMS收集器 - 并发收集、低停顿,但是CMS还远远达不到完美 -- 缺点比较多 1>占用的CPU资源比较多 2>无法处理浮动垃圾 3>基于标记-清除算法实现 -
产生内存碎片

5)G1收集器 - 相对CMS收集器有不少改进 - 基于标记-整理算法

7:减轻J
a0e2
VM垃圾回收处理的代码习惯

1)避免在循环体中创建对象,即使该对象占用内存空间不大

2)尽量及时使对象符合垃圾回收标准

3)不要采用过深的继承层次

4)访问本地变量优于访问类中的变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: