概述
1. System.gc()
① 会显示触发Full GC
② 无法保证垃圾收集器的及时调用 ( 代码执行之后, 没有进行垃圾回收 )
2. 内存溢出
堆中 存活的对象超过堆的总空间, 且GC之后还是如此, 就会发生内存溢出
3. 内存泄漏
① 定义
对象不会再被程序用到, 但是GC又不能回收他们的情况, 叫内存泄漏
② 发生内存泄漏的情况
- 单例模式
单例模式的生命周期和应用程序是一样长的, 所以在单例程序中, 如果持有对外部对象的引用的话, 那么这个外部对象是不能被回收的, 如果这样的对象很多, 则会发生内存泄漏
- 资源未close
数据库连接, 网络连接, io
4. 垃圾回收的并发与并行
① 并行
② 并发
5. 安全点与安全区域
① 安全点的定义
程序执行时, 并非在所有地方都能停顿下来直接开始GC, 只有到达安全点时才能暂停( 安全点的选定不能太少以至于让GC等待时间太长, 也不能过于频繁, 以至于过分增大运行时的负载)
② 安全点的选取
- 循环的末尾
- 方法临返回前
- 调用方法之后
- 抛异常位置
③ 如何在gc发生时, 让所有线程都跑到最近的安全点上停下来
- 方式一 : 抢断式中断
在发生GC时, 首先中断所有线程, 如果发现线程未执行到安全点, 就恢复线程让其运行到安全点上
- 方式二 : 主动式中断(被采用)
在gc发生时, 不直接操作线程中断, 二十简单地设置一个标志, 让各个线程执行时主动轮询这个标志 发现标志为真时, 终端挂起
④ 安全区域
安全点时对正在执行的线程设定的, 如果一个线程处于sleep或者中断状态, 他就不能响应jvm的中断请求, 运行到安全点上, 因此jvm引用了安全区域
安全区域是指在一段代码片段中, 引用关系不会发生变化, 在这个区域内的任意地方, 都可以gc
线程进入安全区时, 先标记自己进入安全区, 等被唤醒准备厉害安全区域时, 先检查是否可以离开, 如果gc完成, 那么线程可以离开, 否则他必须等待, 知道收到安全离开的信号为止
6. 引用
① 强引用
② 软引用
未发生内存溢出, 软引用被清除
最后
以上就是平淡书本为你收集整理的jvm GC相关概念的全部内容,希望文章能够帮你解决jvm GC相关概念所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复