FQueue

JVM垃圾回收机制是怎样的,何时触发YoungGC或FullGC操作?

点点圈 提交于 2021-01-03 00:17:04
听说微信搜索《Java鱼仔》会变更强哦! 本文收录于 JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)关于垃圾回收 JAVA的垃圾回收需要完成三件事情: 1、哪些内存需要回收 2、什么时候回收 3、如何回收 下面就从这三个问题出发去了解Java的垃圾回收机制。 (二)哪些垃圾需要回收 在垃圾回收之前,首要的问题是确定哪些垃圾需要被回收,现在Java通过根搜索算法(GC Roots Tracing)来判断一个对象是否存活,这个算法的思路就是通过一系列名为“ GC Roots ”的对象作为起始点,从这些节点向下搜索,当GC Roots到达不了这个某个对象时(或者说某个对象没有被任何其他对象所引用),就证明这个对象是不可用的,这些对象会被判定为需要回收的对象。 如图,ObjC是不可达的,这个对象就是需要被回收的对象。 在Java语言中,可作为GC Roots的对象包括下面这些: 1、虚拟机栈(栈帧中的本地变量表)中引用的对象 2、方法区中的类静态属性引用的对象 3、方法区中的常量引用的对象 4、本地方法栈(Native方法)引用的对象 (三)什么时候回收 关于如何回收的问题,我参考了《深入理解Java虚拟机》,根搜索算法中不可达的对象,并不是立刻就会被回收,而是会经过一次标记: 如果对象没有覆盖finalize()方法,或者finalize(

深入探究JVM之对象创建及分配策略

风流意气都作罢 提交于 2020-08-17 00:46:51
@ 目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

深入探究JVM之对象创建及分配策略

北战南征 提交于 2020-08-16 00:10:56
@ 目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

JVM虚拟机二:垃圾回收

孤街浪徒 提交于 2020-08-15 08:00:58
在上节介绍过,其中堆中存储几乎所有的对象实例,如上图(这里没有PermGen,因为JDK8以后已经取消了永久代)。 【简单过程】对象是有生命周期的,new一个对象时,会被分配到eden区域,当eden满了以后触发一次Minor GC,仍生存的对象被复制到from区域,当再次GC时,对象从from被复制到to,这个时候from和to的角色互换了,以后再GC,对象会又被辅助到from,来来回回,每次对象的代龄都+1,当累加到一定值(默认18)后,对象还存活的话,被复制到old。 这里有一个区别,如果是大对象,直接进入old,不执行来来回回的过程。 那么如何判定这个对象是不是还活着呢?java采用的是可达算法(除此之外还有计数算法),如果该对象有到达GC Roots的引用路径,就认为是活的,可作为GC Roots的对象包括: 1. 栈中引用的对象; 2. 方法区类静态属性引用的对象; 3. 方法区常量引用的对象; 引用路径根据强弱又分为四种(算上 JNI Weak Reference 就是五种): 强引用(Strong Ref)>软引用(Soft Ref)>弱引用(Weak Ref)>虚引用(Phantom Ref) 1. 强引用:比较常见,如 Student stu=new Student();这个类就是强引用; 2. 软引用:一般在内存不够时,会被回收,这种引用可有可无

深入探究JVM之对象创建及分配策略

拜拜、爱过 提交于 2020-08-11 11:39:52
文章目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

深入理解JVM(③)判断对象是否还健在?

跟風遠走 提交于 2020-07-25 16:16:44
前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(不被引用了)。 判断对象是否健在的算法 1.引用计数算法 引用计数算法,很容易理解, 在对象中添加一个引用计数器,每有一个地方引用它时,计数器值就加一;当引用失效是,计数器值就减一;任何时刻计数器为零的对象就是不可以能再被使用的对象 。 引用计数算法的原理简单,判定效率也很高。市面上也确实有一些技术使用的此类算法来判定对象是否存活,像ActionScript 3 的FlashPlayer、Python语言等。但是在主流的Java虚拟机里面都没有选用引用计算法来管理内存,主要是使用此算法时,必须要配合大量的额外处理才能保证正确的工作,例如要解决对象之间的相互循环引用的问题。 public class OneTest { public Object oneTest = null; private static final int _1MB = 1024 * 1024; private byte[] bigSize = new byte[256 * _1MB]; /** * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否有回收过。 */ @Test public void

应聘阿里,字节跳动美团90%会问到的JVM面试题! 史上最全系列!

痞子三分冷 提交于 2020-04-27 15:52:23
Java 内存分配 • 寄存器:程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码。 • 静态域:static 定义的静态成员。 • 常量池:编译时被确定并保存在 .class 文件中的(final) 常量值和一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。 • 非 RAM 存储:硬盘等永久存储空间。 • 堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。 • 栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么? 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。 而串行收集器对大多数的小应用(在现代处理器上需要大概 100M 左右的内存)就足够了。 在 Java 中,对象什么时候可以被垃圾回收? 当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。 GC 是什么? 为什么要有 GC? GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或 系统的不稳定甚至崩溃,Java 提供的 GC

11.JVM内存分哪几个区,每个区的作用是什么?

℡╲_俬逩灬. 提交于 2020-04-26 13:48:04
分享分享自己收藏的学习资料,有需要的朋友可以找我获取 根据自身面试经历整理以及不断收集的(珍藏版) 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> https://www.cnblogs.com/xiaogeng88/p/12692306.html 1.Java虚拟机主要分为以下一个区: 方法区:1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。3. 该区域是被线程共享的。4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。 虚拟机栈:1. 虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 2. 虚拟机栈是线程私有的,它的生命周期与线程相同。3. 局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置

深入理解Java虚拟机(自动内存管理机制)

烈酒焚心 提交于 2020-04-26 05:47:53
文章首发于公众号: BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的。周志明老师的这本《深入理解 Java 虚拟机》我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Java 虚拟机的理解就更进一步。因而萌生了将读书笔记整理成文的想法,一是想检验下自己的学习成果,对学习内容进行一次系统性的复盘;二是给还没接触过这部好作品的同学推荐下,在阅读这部佳作之前能通过我的文章一窥书中的精华。 原想着一篇文章就够了,但写着写着就发现篇幅大大超出了预期。看来还是功力不够,索性拆成了六篇文章,分别从 自动内存管理机制 、 类文件结构 、 类加载机制 、 虚拟机执行引擎 、 程序编译与代码优化 、 高效并发 六个方面来做更加细致的介绍。本文先说说 Java 虚拟机的自动内存管理机制。 一. 运行时数据区 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。Java 虚拟机所管理的内存被划分为如下几个区域: 程序计数器 程序计数器是一块较小的内存区域,可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令

[总结]-第三章 垃圾收集器与内存分配策略

梦想的初衷 提交于 2020-04-10 00:54:47
[总结]-第三章 垃圾收集器与内存分配策略 一、知识点 1、对象是否存活的判定 引用计数法 可达性分析(GC Roots) 判定对象死亡需要经过2次标记: 第一次标记:可达性分析后没有与GC Roots相连接的引用链。 第二次标记:GC对F-Queue中的对象进行标记(低优先级的Finalizer线程会去执行F-Queue中对象的finalize()方法) 2、引用分类 强引用(Strong Reference) 主要强引用还在,则垃圾收集器不会回收被引用的对象。 软引用(Soft Reference) 内存不足即将OOM时,回收。比如:缓存数据。 弱引用(Weak Reference) 只要gc就回收。 虚引用(Phantom Reference) 可以判断被关联的对象是否被GC 3、finalize( ) 任何一个对象的finalize()方法都只会被系统自动调用一次。(注意是对象,并不是类); finalize()如果耗时过长,GC并不会等待。它只是通知另一个线程(Finalizer)去执行而已; 知道即可,不建议使用; 4、垃圾收集算法 引用计数器 优点:实时性,只要对象的引用计数器为0,立刻回收; 缺点:互相引用就永远无法去除。 标记、清除 (一般在老年代适用) 标记:找到所有可访问的对象,做个标记; 清除:遍历堆,把未标记的对象清除; 缺点:1、标记、清除效率都低;2