我是靠谱客的博主 平淡书本,最近开发中收集的这篇文章主要介绍jvm GC相关概念,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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相关概念所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部