Java虚拟机----垃圾回收与内存分配
一、垃圾回收的对象:
在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虚拟机----垃圾回收与内存分配的更多相关文章
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java的垃圾回收和内存分配策略
本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...
- Java GC 垃圾回收算法 内存分配
垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- Java虚拟机垃圾回收(三) 7种垃圾收集器
Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
- Java虚拟机垃圾回收(三): 7种垃圾收集器(转载)
1.垃圾收集器概述 垃圾收集器是垃圾回收算法(标记-清除算法.复制算法.标记-整理算法.火车算法)的具体实现,不同商家.不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
随机推荐
- H5_0001:localStorage本地存储
localStorage的优势 1.localStorage拓展了cookie的4K限制 2.localStorage会可以将第一次请求的数据直接存储到本地,这个相当于一个5M大小的针对于前端页面的数 ...
- ES6 数组遍历方法的实战用法总结(forEach,every,some,map,filter,reduce,reduceRight,indexOf,lastIndexOf)
目录 forEach every some map filter reduce && reduceRight indexOf lastIndexOf 前言 ES6原生语法中提供了非常多 ...
- yolo类检测算法解析——yolo v3
每当听到有人问“如何入门计算机视觉”这个问题时,其实我内心是拒绝的,为什么呢?因为我们说的计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是错综复杂交相辉映,就好像数学一样,如何学习数学?这问题 ...
- luogu P5300 [GXOI/GZOI2019]与或和
传送门 题目涉及按位与以及按位或运算,所以可以拆位考虑,枚举某个二进制位,然后某个位置如果那个数的第\(i\)位是\(0\)就放\(0\),否则放\(1\),这一位的贡献就是位运算后值为\(1\)的子 ...
- Django REST Framework API Guide 08
1.Filtering 2.Pagination FIltering GenericAPIView的子类筛选queryset的简单方法是重写.get_quueryset()方法. 1.根据当前用户进行 ...
- 在右键菜单中加入BitLocker重新上锁功能
当使用BitLocker给磁盘上锁后,可以通过命令:manage-bde -lock d: -forcedismount 将已经解锁的磁盘重新上锁,如果觉得每次都通过命令行写命令很麻烦,那可以通过修改 ...
- OpenCV使用中的一些总结
一.threshold阈值操作 1.阈值可以被视作最简单的图像分割方法.例如,从一副图像中利用阈值分割出我们需要的物体部分,这样的图像分割方法基于图像中的物体与背景之间的灰度差异. 2.thresho ...
- .Net Core ----通过XUnit进行接口单元测试(带请求头及参数)并用output输出结果
最近在做core的接口单元测试,所以在这拿出来分享一下,添加XUnit的nuget包 话不多说,直接上代码了: 输出结果(需要的命名空间using Xunit.Abstractions;): ITes ...
- rsyslog磁盘辅助(Disk-Assisted)模式踩坑记
最近公司为方便tracing.排查, 搞全链路日志收集,而我手上的10亿+pv的动态前端服务必然在考虑之列. 之前呢. 都是运维定制的收集方式: 如上图,rsyslog push kafka, 优点嘛 ...
- java集合(list,set,map)
集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...