一、垃圾回收的对象:

在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. Pandas系列(七)-计算工具介绍

    内容目录 1. 统计函数 2. 窗口函数 3. 加深加强 数据准备 # 导入相关库 import numpy as np import pandas as pd #Pandas 中包含了非常丰富的计算 ...

  2. saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)

    一.编写插件基类 1.目录结构 1.我是如何获知我有多少种系统? 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了 每次对主机发送命令的动作时,我从库里把数据取出来 ...

  3. 解决Java getResource 路径中含有中文的情况

    问题描述 当Java调用getResource方法,但是因为路径中含有中文时,得不到正确的路径 问题分析 编码转换问题 当我们使用ClassLoader的getResource方法获取路径时,获取到的 ...

  4. matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题

    这句话大致意思就是: b = 0;for i = 1:3    a(i) = b;end是说变量的长度是变化的,经常在循环里出现,比如上面这个例子,这样会影响计算速度,最好的办法是预先定义a的长度,比 ...

  5. China-global view

    Good morning everyone. Everyone here would know this year Xia’Men held the BRICS business forum.In a ...

  6. Linux下使用crontab对MYSQL进行备份以及定时清

      数据备份是一个项目必需的工作,保证数据库出问题时,将损失减小到最低.本文记录下linux服务器中使用脚本对MYSQL数据备份,并且定时清除7天前的备份. crontab定时备份 1.创建备份目录 ...

  7. LCA学习笔记

    写在前面 目录 一.LCA的定义 二.暴力法求LCA 三.倍增法求LCA 四.树链剖分求LCA 五.LCA典型例题 题目完成度 一.LCA的定义 LCA指的是最近公共祖先.具体地,给定一棵有根树,若结 ...

  8. 【Hibernate】could not instantiate class.. from tuple] with root cause

    使用hibernate的过程中出现了这个问题,查询语句如下: String hql = "select new GoodsBean(id, name, price, proPic, sale ...

  9. asp.net MVC路由配置总结

    URL构造 命名参数规范+匿名对象 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}&qu ...

  10. PYTHON-进程 子进程

    并发编程 学习目标: 见35复习 1.操作系统 什么是操作系统 操作系统的两大作用: 批处理操作系统: 操作系统发展史: 多道技术***** 产生背景: 两大核心点: 应用软件的优化的核心:***** ...