java内存gc相关复习
##平台无关性
jvm如何加载一个.class 文件的, classloader -》runtime data area -〉execution engine -》native interface
java 反射机制是 在运行状态中,对于任意一个类都能知道这个类的所有属性和方法,对于任意一个对象都能任意调用它的方法和属性;这种能力称 java 反射机制。
classforname();获取实例 , method 或者方法,invoke 进行调用。setacessiable 为true
bootstrapclassloader extclassloader appclassloader
##为什么有双亲委派机制?
避免同一个class被多次加载,如果一个class 被加载是需要先去查询父类加载器是否已经加载,如加载直接返回。
class.forname 是完成初始化的
classloader.loadclass 为未完成初始化的
元空间metaspace 和 永久代区别 都属于 方法区,jdk8 之后元空间代替了永久代,元空间使用本地内存,永久代使用jvm内存。
metaspace优势于永久代的几点:
- 当虚拟机启动,初始化用户指定的主类.
- new 操作实例化目标类 会触发类的初始化
- 静态方法的调用,触发方法所在的静态类
- 静态变量引用,触发静态变量所在的静态类
- 如果接口 定义了default 方法,那么直接实现或者间接实现接口类的初始化,会触发初始化接口.
- 使用反射API 对应某类调用时,会触发该类的初始化操作.
##java堆
对象实例的分配区域,堆可以是物理不连续的空间,但是逻辑上是连续的空间
jvm三大调优参数
-Xms 堆初始大小
-Xmx 堆能达到的最大值
-Xss 规定每个虚拟机栈的大小(堆栈)
##java内存中堆和栈的区别-内存分配的策略
静态存储:编译时确定每个数据目标在运行时的存储空间
栈式存储:数据区在编译时未知,运行时模块入口前确认
堆式存储:编译时或运行时模块前都无法确认,动态分配
联系 :引用对象、数组时,栈里定义变量保存堆中目标的首地址。
例如调用Person p = new Person 这个对象时,在栈中存储p这个变量,这个变量的引用地址为堆中这个对象的指针。
栈是自动释放,堆需要gc回收
空间大小栈比堆小
栈碎片小于堆
分配方式堆只有动态分配,栈可以是静态和动态
栈的效率比堆高
jdk 6 和jdk6+ 之后 string 的intern 方法区别?
6+以后不仅仅在字符串常量池中创建对象,而且还会在堆中创建一份。
## 垃圾回收机制
判断对象是否进行引用了
引用计数法,可达分析算法
可做为gc Root对象
- 虚拟机栈中引用的对象
- 方法区中常量引用的对象
- 方法区中静态变量引用的对象
- 本地方法栈中jni引用的对象
- 活跃线程引用的对象
垃圾回收的算法
标记-清除
- 从根集合进行扫描,对存活对象进行标记
- 对堆内存进行线性遍历,回收不可达的对象
- 碎片化严重,后续如果遇到大对象需要连续内存则触发垃圾回收
复制算法
- 分二块区域,存活的对象复制到to区域,之后from区域全部清除,适合生命周期短的对象。年轻代算法。
标记-整理
- 从根集合进行扫描,对存活对象进行标记
- 移动所有存活对象且按照内存地址一次排序,然后将内存地址末端进行回收。
分代垃圾回收算法
- 针对不同的区域进行不同的垃圾回收机制,年轻代用复制算法,老年代和永久代用标记整理或者标记清除算法,1.8以后没有永久代。
Eden survivors 区 比例8:1:1 young占1/3 堆内存 ,老年代2/3 内存
- -XX:MaxTenuringThreshold 参数是经过多少次minor gc 进入 老年代。 默认值15次
- -XX:pertennuerSizeThreshold 控制大对象的大小
- -XX:survivorRatio eden和survivor 的比值 默认8:1:1
- -XX:NewRatio 年轻代和老年代比值 。2
触发full gc 条件
- 老年代空间不足
- 7之前版本 永久代空间不足
- minor gc 晋升到老年代的空间大于老年代的剩余空间
- rmi 来进行rpc的java应用默认会一个小时执行一次full gc
垃圾收集器
-XX:UseParNewGC 这个是减少时间停顿 多线程手机其他serial 收集器一样,复制算法 能于cms 一起配合工作
年轻代使用的垃圾收集器 默认是吞吐量-XX:UseParallelGC
CMS -XX: UseconcMarkSweepGC 标记清除 减少停顿
初始标记,并发标记,重新标记,清除。会有stop the world 空间碎片问题
-XX:UseG1GC 用于年轻和老年代的垃圾回收器 复制+标记-整理
将整个堆划分成独立多个region区域
强引用,软引用,弱引用,虚引用
强引用必须收到设置为null,并且jvm认可抛出oom也不会回收的对象
软引用 高速缓存,没有足够空间是垃圾回收 softReference
虚引用,