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:减轻JVM垃圾回收处理的代码习惯
1)避免在循环体中创建对象,即使该对象占用内存空间不大
2)尽量及时使对象符合垃圾回收标准
3)不要采用过深的继承层次
4)访问本地变量优于访问类中的变量