注意:本文主要参考自《深入理解Java虚拟机(第二版)》

说明:查看本文之前,推荐先知道JVM内存结构,见《第一章 JVM内存结构》

1、内存回收的区域

  • 堆:这是GC的主要区域
  • 方法区:回收两样东西
    • 无用的类
    • 废弃的常量
  • 栈和PC寄存器是线程私有区域,不发生GC

2、怎样判断对象是否存活

垃圾回收:回收掉死亡对象所占的内存。判断对象是否死亡,有两种方式:

  • 引用计数法

    • 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1;引用失效时,计数器值-1
    • 实际中不用,不用的两个原因
      • 每次为对象赋值时,都要进行计数器值的增减,消耗较大
      • 对于A、B相互引用这种情况处理不了(这一点是不用的主要原因)
  • 可达性分析(跟踪收集)
    • 原理:从根集合(GC Roots)开始向下扫描,根集合中的节点可以到达的节点就是存活节点,根集合中的节点到达不了的节点就是将要被回收的死亡节点,如下图中的A/B/C是存活节点,D/E是死亡节点:

  • 根集合中的节点包括:简单来讲,就是全局性的引用(常量和静态属性)和栈引用(下边第一、三)

    • Java栈中的对象引用(存在于局部变量表中,注意:局部变量表中存放的是基本数据类型和对象引用)

      • 这是垃圾回收最多考虑的地方,所以有时,我们也会将死亡对象称为"没有引用指向的对象"
    • 方法区中:常量+静态(static)变量
    • 传到本地方法中,还没有被本地方法释放的对象引用

3、3种引用类型

  • 强引用(Strong Reference):A a = new A();//a是强引用
  • 软引用(Soft Reference):当内存不足时,释放软引用所引用的对象;当内存足够时,就是一个普通对象(强引用)
  • 弱引用(Weak Reference):弱引用对象只能存活到下一次垃圾回收之前,一旦发生垃圾回收,立刻被回收掉

4、方法区的回收

  • 废弃常量:例如,没有任何一个引用指向常量池中的"abc"字符串,则"abc"字符串被回收
  • 无用的类:满足以下三个条件
    • Java堆中不存在该类的任何实例
    • 加载该类的ClassLoader被回收
    • 该类的Class对象没有在任何地方被引用

注意:

  • 在实际开发中,尽量不用JSP去做前端,而是用velocity、freemarker这样的模板引擎去做
  • 与类相关常用的三个参数:
    • -XX:+PrintClassHistogram:输出类统计状态
    • -XX:-TraceClassLoading:打印类加载信息
    • -XX:-TraceClassUnloading:打印类卸载信息
      View Code

5、垃圾回收线程

系统的垃圾回收是由垃圾回收线程来检测操作的,该线程是一个后台线程(daemon thread)。

5.1、后台线程与我们使用的前台线程而言,有一个特点:当JVM中的前台线程数量为0时,后台线程自动消亡。可以这样讲,后台线程依托于前台线程而存在。

5.2、垃圾回收线程为什么要设置成为后台线程呢?

我们想一下,当前台一个线程都没有时,垃圾还会有吗?或者说垃圾回收还有必要吗?答案是没有必要,所以此时垃圾回收线程也就失去了存活的意义。

所以可以这样讲,将一个线程是否设置为后台线程,就看这条线程在没有其他线程存在的情况下,是否还有存活的意义。

例如,在我们使用Apache mina2做RPC时,我们在消息的接收端直接开启一个后台线程启动服务来接受消息发送端发来的消息事件请求就可以。试着去想,如果在整个JVM中只有当前的这一个后台线程了,那么这个线程还有必要存活下来吗?当然没有必要,因为消息永远都不会再发送了(前台线程都没了)

转载于:https://www.cnblogs.com/java-zhao/p/5183048.html

第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程相关推荐

  1. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

  2. java怎么强制回收某个对象_4、如何强制垃圾回收一个对象?(java)

    4.如何强制垃圾回收一个对象?(java) 检举 | 2008-10-25 19:12 提问者: 路瓶子 | 浏览次数:2956次 4.如何强制垃圾回收一个对象? A)垃圾回收不能被强制执行. B)调 ...

  3. jvm内存分配及对象创建和回收过程

    个人博客:https://suveng.github.io/blog/​​​​​​​ Java历史 2004.9 jdk1.5 tiger 自动装箱拆箱,泛型,,注解,枚举,变长参数,增强for循环 ...

  4. JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法

    CMS 并发回收,工作线程和GC线程同时进行,暂停时间短 老年代 分为 四个阶段: 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长 并发标记:垃圾回收线程和工作线程同时执行.一边产生垃 ...

  5. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  6. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  7. 一文详解java中对JVM的深度解析、调优工具、垃圾回收

    2019独角兽企业重金招聘Python工程师标准>>> jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以 ...

  8. jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器

    1.1.那究竟GC为我们做了什么操作呢? 1 ,哪些内存需要回收? 2 ,什么时候回收? 3 ,如何回收? 这时候有人就会疑惑了,既然GC 已经为我们解决了这个矛盾,我们还需要学习GC 么?当然当然是 ...

  9. JVM调优总结(2):基本垃圾回收算法

    转载自   JVM调优总结(2):基本垃圾回收算法 可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一 ...

最新文章

  1. 阿里2018营收2502亿元,云计算业务增幅超100%
  2. pdfminer3k 官方文档_IPFS官方周报112期
  3. 字节流写数据加异常处理
  4. php return直接输出,PHP中return用法详细解读
  5. Oracle 10g 高级安装图文教程(二)
  6. c++重载++运算符_C ++运算符重载| 查找输出程序| 套装3
  7. C语言文件打开方式及说明
  8. 解读8大场景下Kunpeng BoostKit 使能套件的最佳能力和实践
  9. 在Linux系统下更改或更新SSH密钥密码的方法
  10. python经典程序实例-Python3经典100例(①)
  11. Windows Mobile Sensors API库的设计
  12. PostgreSQL Heap Only Tuple - HOT (降低UPDATE引入的索引写IO放大)
  13. .Net中常用的几种ActionResult
  14. 怎样提高文章原创度,被快速收录?
  15. EmmyLua的安装与使用
  16. linux查看显卡温度cpu温度,怎样从指令提示符窗口查看cpu温度
  17. 计算机大神专业小说,大神作品排行榜:网络小说大神级作者前50名
  18. [原创]UMail for linux邮件服务器备份/还原邮件数据与数据库
  19. codevs 5960 信使x
  20. 切西瓜:把一个西瓜切9刀

热门文章

  1. RTX5 | 线程标志组01 - 线程同步
  2. python2与_python2和python3的区别
  3. Java笔记-Java端口扫描功能(含TCP包分析以及原理)
  4. 前端工作笔记-element ui弹窗嵌套并获取输入
  5. 前端笔记-Vue中缺少router-view导致跳转失效
  6. 计算机指令要素,【计算机系统】CPU指令执行流程与指令流水线原理
  7. java test circle_java-使用Jacoco和Circle CI生成测试覆盖率失败
  8. js页面倒计时7天 java_javascript实现倒计时效果
  9. (软件工程复习核心重点)第十章面向对象设计-第一节:面向对象设计的基本概念与准则
  10. (王道408考研数据结构)第六章图-第三节:图的遍历(DFS和BFS)