一、垃圾回收的对象:

在Java的运行时数据区中,程序计数器和虚拟机栈、本地方法栈是随着线程的生灭而生灭,栈当中栈帧的大小在编译的时候已知,在方法结束之后栈帧出栈,这部分的垃圾回收是明确的,因此需要讨论的垃圾回收的区域是,以及方法区

二、怎么判断一个对象是否存活:

1、引用计数算法:给对象添加一个引用计数器,当有一个地方引用它时加1,引用失效的时候减1,当引用计数器值为0的时候对象就不再被使用,判定对象已死。

---- 事实上java虚拟机不是使用这样子的算法来判断对象是否存活的,因为这样很难解决对象之间相互循环引用而又没有被其他地方调用(这种情况是可以被回收)的问题。

2、可达性分析算法:

通过一系列的“GC ROOTS”对象作为起始点,从这些节点往下搜索它的引用链,一个对象只要在任何的引用链上能连接上“GC ROOTS”对象,则这个对象是存活的,否则对象则已死。

这些“GC ROOTS”对象包括:

  • 虚拟机栈(栈帧)中引用的对象,
  • 方法区中类的静态属性引用的对象,
  • 方法区中常量引用的对象

三、引用:

传统的引用定义:

  如果reference数据当中存储的数值代表的是另外一个内存的起始地址,就称这块内存代表着一个引用。

扩充后的引用:

  强引用、软引用、弱引用、虚引用。

  • 强引用:类似使用new指令创建的引用---------只要强引用还在,垃圾收集器就不会回收掉被引用的对象
  • 软引用:描述一些有用但是非必需的对象-----在系统将要发生内存溢出异常之前会软引用的对象进行一个尝试回收,如果还无法回收到足够的空间才会抛出内存溢出异常;
  • 弱引用:也是描述非必需对象的-----------------在下一次的垃圾回收时一定会对这些弱引用对象进行回收;
  • 虚引用:对象的虚引用不会对对象的生存时间产生影响,唯一目的是在对象被垃圾收集器回收的时候能收到一个系统通知。

四、对象具体的生存和死亡:

在可达算法中的对象,会根据四个引用类型进行相应的垃圾回收操作,而对于“”不可达“”的对象,也并非是直接进行回收,需要进行两次标记:

第一次标记:发现对象没有到“GC ROOTS”对象的引用链,则将进行第一次标记,并且进行第一次筛选,筛选的条件是此对象是否有必要执行finalize()方法;当对象没有finalize()方法,或者是finalize()方法已经被调用过,则判定该对象没有必要执行finalize方法。如果判定对象需要执行finalize方法则把对象放入F-Queue队列中(虚拟机会有一个低优先级的线程去执行它,至于执行结果并不去管,不管它是成功还是失败)

第二次标记:对放在F-Queue队列的对象进行第二次标记,如果它还是不可达的,那么只能被回收了。

进行两次标记是给了对象一个自我拯救的机会,第一次标记之后会调用finalize()方法,如果在这个方法中这个对象又被引用了,那么这个对象就可以自救了,需要注意的是,一个对象的finalize方法只能被执行一次,也就是说它只能自救一次,这也是可以理解的,否则一个对象在finalize中进行无限次自救,它将永远不会被回收。

Java虚拟机----垃圾回收与内存分配的更多相关文章

  1. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  2. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

  3. Java GC 垃圾回收算法 内存分配

    垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...

  4. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  5. Java虚拟机垃圾回收(三) 7种垃圾收集器

    Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java ...

  6. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  7. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  8. Java虚拟机垃圾回收(三): 7种垃圾收集器(转载)

    1.垃圾收集器概述 垃圾收集器是垃圾回收算法(标记-清除算法.复制算法.标记-整理算法.火车算法)的具体实现,不同商家.不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚 ...

  9. Java虚拟机垃圾回收(二) :垃圾回收算法(转载)

    1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...

随机推荐

  1. canvas绘图工具

    关于canvas绘图,在html页面上太方便了.当然刚开始还是入了不少坑,用了比如jcanvascript等三方插件.真实效果反而不理想,后来就没用插件. 下面是实现效果,可以在线绘制工地图然后传给后 ...

  2. windows下使用curl命令 && 常用curl命令

    什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...

  3. [物理学与PDEs]第1章习题1 无限长直线的电场强度与电势

    设有一均匀分布着电荷的无限长直线, 其上的电荷线密度 (即单位长度上的电荷量) 为 $\sigma$. 试求该直线所形成的电场的电场强度及电势. 解答: 设空间上点 $P$ 到直线的距离为 $r$, ...

  4. du---查看文件夹大小-并按大小进行排序

    使用df 命令查看当前磁盘使用情况: df -lh [root@gaea-dev-xjqxz-3 ~]$ df -lh Filesystem Size Used Avail Use% Mounted ...

  5. Python3:判断三角形的类型

    # 判断三角形类型def triangle(a,b,c): if a>0 and b>0 and c>0: if a+b>c and b+c>a and a+c>b ...

  6. 《java与模式》

    2012年3月 随笔档案 - java_my_life - 博客园--此网友 12年的博客都是和模式有关的,希望可以多看看.http://www.cnblogs.com/java-my-life/ar ...

  7. radio日志sim卡信号状态分析

    logcat -b radio日志 // 接着将slot 0主卡置为false,将slot 1设置为true 08-09 11:24:40.335 2565 3243 D RILJ : [4820]& ...

  8. java 面经

    1.什么是Java虚拟机(JVM)?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...

  9. rest_framework框架的认识

    它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 在routers模块下 封装了很多关于 ...

  10. apt-get本地软件源搭建

    参考:https://www.cnblogs.com/myitroad/p/4970416.html 试验机器: Ubuntu 12.04.Lubuntu.Debian都可,其他版本应该也没问题,服务 ...