Java垃圾回收机制
- 没有被任何对象引用就是垃圾
- 引用计数算法
- 每个对象有一个引用计数器
- 效率高
- 无法检测循环引用,内存泄漏
- 可达性分析算法
- 引用链可达来判断
- 可作为gc root对象
- 虚拟机栈中引用的对象
- 方法区域常量引用对象
- 方法区静态属性引用的对象
- 本地方法栈中JNI的引用对象
- 活跃线程引用状态
垃圾回收算法
- 标记清除法
- 标记
- 清除
- 缺点 碎片化
复制算法
- 分为对象面 和 空闲面
- 对象在对象面创建
- 存活对象被从对象面复制到空闲面
- 将对象所有对象内存清除
分代收集算法
- 组合算法
- 不同情况不同策略
年轻代 老年代 永久代
gc分类
- Minor GC
- Full GC
年轻代 快速收集生命周期短的对象
年轻代升级到老年代
- 大对象
- minor次数存活
- survivoir区存放不下
调优参数
- -XX:SurviviorRatio EDen Survivo 比值
- XX NewRatio 老年代和新生代内存大小比例问题
- -XX MAXTENURINGThreshjold 对象升级老年的阈值
老年代生命周期较长
- 标记清理
老年代
- Full GC Major GC
- Full GC Minor GC慢
触发Full GC条件
- 老年代空间不足
- 永久代不足
- CMS GC出现promotion failed concurrent mode failure
- 调用System.gc()
分代收集算法
safepoint
- 分析引用关系不会变化的地方
- 方法调用 循环跳转 异常跳转
- 安全点数量适中
常见垃圾收集器
- jvm
- server
- client
年轻代垃圾收集器
- serial 收集器
- 单线程
- 简单高校 client 默认
- parNew收集器
- 多线程
- 单核不行,多核有优势
- parallel Scavenge收集器
- 关注吞吐量
- server默认
老年
- serial old 单线程 clinet
- parallel
- cms收集器
- g1收集器
- 并发 并行
面试题
Object 的finalize()方法和C++系够函数区别
- C+_+系够函数确定 ,它不确定
- 未被引用的对象放置在F-queue队列
java强引用 软引用 弱引用 虚引用
强引用
- 内存溢出也不好回收
- 设置为null使其被回收
软引用
- 对象处于有用但是非必须时候的状态
- 内存不足会回收
- 实现高速缓存
弱引用
- 非必须 更弱
- gc回收回
- 偶尔使用且影响垃圾收集
虚引用
- 不会决定对象生命周期
- 任何时候都可能被垃圾回收期回收
java 理解
- 平台无关
- GC
- 语言特性 流 lambda
- 面向对象
- 类库
- 异常处理
平台无关
javac编译 生成字节码 jvm解析 转换为特定平台执行指令
java class jvm
jvm加载.class文件
- class files class loader
- execution engine 命令进行解析
- native interface 融合不同开发语言的原声库为java所用
- runtime data area jvm内存模型
反射
- 任意一个类 都知道他的属性和方法,能调用他的属性和方法
class loader
- class二进制数据流装载进来
- bootStrapClassLoader C++ 编写 java.
- ExtClassLoader java编写 javax.
- appclassLoader java编写自定义classloader
类加载器双亲委派机制
- 避免多份字节码加载
类加载方式
- 隐式 new
- 显示 loadClass forName
类装载过程
- 加载
- 链接
- 校验
- 准备
- 解析
java内存模型
- 内存 逻辑地址 分段机制 线性地址 分页管理 物理地址
地址空间
- 内核空间
- 用户空间
数据段 代码段
线程私有 程序计数器 虚拟机栈 本地方法栈
局部变量表 所有变量
操作数 入栈 出栈 复制 交换 产生消费变量
递归暴栈
线程共享 java堆 metaSpace
元空间 永久代区别
- 元空间使用本地内存 永久使用jvm内存
- 字符串在永久代 出现性能问题
- 类方法信息大小不一定,困难
- 永久代给gc复杂性
java 堆
- 对象实例
JVM三大调优参数
Xss 堆栈大小
xms 堆初始值
xmx 堆最大值
堆 栈 内存分配区别
- 静态存储:编译确定存储空间
- 栈式存储 编译未知 运行时候模块入口确定
- 堆存储 编译 运行都不能确定
管理方式
- 堆自动释放 堆需要gc
- 堆大
- 碎片相关 栈碎片小于
- 分配方式 静态 动态 栈都可以 堆只能动态
- 栈效率更高