一、垃圾回收的对象:

在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. 爬虫案例之Pubmed数据库下载

    代码 # encoding=utf-8 import os, time, re import urllib.request import urllib.parse import ssl ssl._cr ...

  2. 第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult

    一. 背景 在MVC框架中,我们可能经常会用到 return Json(),而Json方法内部又是一个JsonResult类,那么JsonResult内部又是什么原理呢?在MVC框架中,各种xxxRe ...

  3. 滚动锚定(Scroll Anchoring)- 让视口内容不再因视口上方 DOM 元素的高度变化而产生跳动

    不知道你有没有经历过这样的场景:当你打开一张“多图杀猫”的页面后,正一张图一张图边滚边看,在你刚准备定睛看某一张图的时候,这张图突然被它上面的内容挤到了视口下方,然后你赶紧把滚动条往下拉,试图追赶这张 ...

  4. Windows系统盘符错乱导致桌面无法加载。

    问题如下 : 同事有台笔记本更换SSD硬盘,IT职员帮他将新硬盘分好区后再将系统完整Ghost过来,然后装到笔记本上.理论上直接就可以使用了!但结果开机后登陆用户桌面无法显示,屏幕黑屏什么都没有. 问 ...

  5. Ubuntu 18.04 LTS搭建GO语言开发环境

    一.下载Go语言安装包 官网下载地址:https://golang.org/dl/,使用tar命令将档案包解压到/usr/local目录中: sudo tar -C /usr/local -xzf g ...

  6. codeblocks修改字体颜色-背景颜色

    常用: 1. 编辑器背景-豆沙绿配置:色调85,饱和度123,亮度205: 2. 注释颜色-紫色:rgb(255,0,255): 参考: 改变codeblocks里面各种注释的颜色 常用颜色的RGB值 ...

  7. Web从入门到放弃<7>

    从这章开始读<javascript高级程序设计> <1>typeof 返回字符串 / 类型 未定义:undefined 布尔:boolean 字符串:string 数值:num ...

  8. 解决前后端分离后的Cookie跨域问题

    一. 前端Ajax关键配置 $.ajax({ type: "post", url: xxx, data: xxx, contentType: 'application/json', ...

  9. 两个c语言结构体复制的问题

    以前一直以为结构体要通过memcpy来复制,现在才明白可直接用“=”复制 C语言中,结构体是一篇连续的内存空间,使用=赋值操作,底层用到的就是memcpy:如果结构体中有指针变量:操作后.两个指针指向 ...

  10. maven无法下依赖jar文件的解决方案

    问题描述: Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be ...