线程私有的程序计数器、虚拟机栈和本地方法栈随线程而生,随线程而灭。栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈。

  而Java堆和方法区因为需要多大内存、创建多少对象都是不确定的,因此这两个区域是垃圾回收的重点对象。

一、如何判断对象是否存活

1. 引用计数法

  给每个对象添加一个引用计数器,有一个地方引用就+1,引用失效就-1。计数器为0,即该对象无法被访问。

优点:实现简单,判断效率高。

缺点:难以解决对象之间的循环引用问题。

2. 可达性分析法

  通过一系列“GC Roots”的对象作为起始点,向下搜索。判断是否可以通过"GC Roots"对象的引用链访问到对象。

  可以作为“GC Roots”的对象:

  1.   虚拟机栈(栈帧中的本地变量表)中引用的对象
  2.   方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中引用的对象

二、 Java中的4中不同程度的引用

  强引用:new出的。只要强引用还在,永远不会被垃圾回收。

  软引用:SoftRefference类来实现。系统将要发生内存溢出异常之前,将这些对象进行二次回收。

  弱引用:WeakRefference类来实现。只能生存到下一个垃圾回收期。无论内存是否充足,都会回收。

  虚引用:PhantomRefference类来实现。

三、 回收方法区

  “废弃常量”

    没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量。

  “无用的类”

  1. 该类的所有实例都已被回收
  2. 加载该类的ClassLoader已经被回收
  3. 该类的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

四、垃圾收集算法

1. 标记 — 清除算法

首先标记出所有需要回收的对象

然后对标记完成的对象统一进行回收

缺点: 内存分配的效率很低,产生大量的内存碎片。

2. 复制算法

将内存分为两块,每次使用其中一块。垃圾回收时,将存活的对象复制到另一块上面,然后清理已使用过的内存空间。

优点:内存分配效率高,实现简单,运行高效。

缺点:内存浪费严重。

改进:新生代使用Eden,from,to( 8 : 1 : 1)

3. 标记 — 整理算法

先对所有对象进行标记,然后让存活对象都向一端移动。

4.分代收集算法

新生代使用 复制 算法

老年代使用 标记 — 整理 算法

深入理解JAVA虚拟机阅读笔记2——垃圾回收的更多相关文章

  1. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

  2. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  3. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  4. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

  5. 深入理解Java虚拟机--阅读笔记二

    垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...

  6. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  7. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  8. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  9. 深入理解Java虚拟机--阅读笔记三

    垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...

随机推荐

  1. Tomcat 基础

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  2. Scrapy中的POST请求发送和递归爬取

    POST请求发送 重写爬虫应用文件中继承Spider类的 类的里面的start_requests(self)这个方法 def start_requests(self): #请求的url post_ur ...

  3. ruby安装卸载

    1.用命令yum install ruby安装,是2.0以下的版本.不建议使用 2.2.2以上  下载地址:https://www.ruby-lang.org/en/news/2018/03/28/r ...

  4. 关于Myeclipse的MyEclipse:Java was started but returned exit code=-1 错误

    我们在安装MyEclipse后有时会遇到这样一个问题,可以进入主界面软件也属于激活状态,但是过一会会报错, 并弹出MyEclipse:Java was started but returned exi ...

  5. load和loads的区别

    相同点 load 和loads 都是实现"反序列化" 区别 1.loads loads针对内存对象 loads: 将 字符串 转换为 字典 # 这是一个字符串'{"b&q ...

  6. Navicat连接mysql报错1251

    Navicat无法连接MySQL8,是因为MySQL8的方式和MySQL5的加密方式不一样导致 解决方案: 1.通过命令行进入mysql数据库: C:\Windows\system32> mys ...

  7. MySQL基础(一)

    首先需要安装MySOL,这里我是在windows环境下安装的,具体教程可以参考https://www.cnblogs.com/xsmile/p/7753984.html,不过要注意安装过程可能会不太顺 ...

  8. 工程能力之C4模型

    概述 刚在InfoQ上看到一篇介绍C4Model的文章,觉得这个模型设计的很赞,很有指导意义,做个简单的记录. Why,为什么需要架构图? ThoughtWorks中国 文章中有几句话我觉得很有道理, ...

  9. 让CentOS在同一个窗口打开文件夹

    http://www.linuxidc.com/Linux/2010-04/25756.htm

  10. 配置idea

    http://www.cnblogs.com/yangyquin/p/5285272.html