在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚拟机都采用分代收集算法,根据对象的存活周期的不同将内存分为几块:新生代,老年代. 新生代,每次垃圾收集都会有大批量对象死去,只有少量存活,所以适合采用“复制算法”: 老年代,对象存活率比较高,没有额外的分配担保,所以一般采用“标记-清理”活着“标记-整理”算法: 1.标记-清除 缺点: 效率低下,标…
Java虚拟机系列--检视阅读 参考 java虚拟机系列 入门掌握JVM所有知识点 2020重新出发,JAVA高级,JVM JVM基础系列 从 0 开始带你成为JVM实战高手 Java虚拟机-垃圾收集器(整理版) RednaxelaFX知乎问答 RednaxelaFX博客 Class类文件讲解不够透彻,需要找份新的资料. 内存区域 Java虚拟机在执行Java程序过程中会把它所管理的内存划分为若干个(主要5个部分)不同的数据区域.这些区域有自各的用途,以及创建及销毁时间,有的区域(方法区.堆.直…
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好.所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容.接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine) 和 JUC (java util concurrent ) 上,对 Java 虚拟机和 Java 并发编…
我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的开发,但是如果你了解JVM的底层知识,你就能更加了解java这门语言的本质,从而对你应用层的java程序的性能优化起到很大的帮助(主要是指内存方面的)另外像一些要求比较高的公司可能在面试的时候会问一些JVM相关的知识,如博主在阿里巴巴内推一面的时候就被问到过JVM的内存区域模型(要知道博主目前可是大…
<深入理解 Java 虚拟机>学习 -- 垃圾收集器 1. Serial 收集器(新生代) 含义: 单线程收集器. 缺点: 进行垃圾收集时,必须暂停其他所有的工作线程. 优点: 简单而高效. 示例: 2. ParNew 收集器(新生代) 含义: Serial 收集器的多线程版本,使用多条线程进行垃圾收集. 示例: 3. Parallel Scavenge 收集器(新生代) 含义: Parallel Scavenge 收集器的目标是达到一个可控制的吞吐量.而 CMS 等收集器的关注点则是尽可能地…
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 Synchronized 原理 synchronized关键字是通过字节码指令来实现的 synchronized关键…
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是通过一个虚函数表来完成的,这也很好理解,那么java语言的多态性是怎么实现的呢?在java中是否也存在类似C++中的虚函数表的结构呢?这就需要我们从java虚拟机字节码执行引擎的执行过程来找答案了,下面就从java虚拟机字节码执行引擎的执行过程带领大家彻底理解java中的多态性. 通过前面的[jav…
声    明 罗汉果与Java虚拟机系列博文仅为本银结构性整合Java虚拟机知识的笔记和日常JVM问题的DEBUG记录.放到网上主要是为了方便自己今后查看.顺带能帮助到别人就更奈斯了. 目    录 (1)为什么要学习Java虚拟机 (2)Java虚拟机学习笔记(一) (3)深入浅出Java类加载过程-学习笔记(二)…
Java语言最大的优势除了它的平台无关性之外,还有它的自动内存分配和垃圾收集技术,本节我先来总结一下垃圾收集相关的内容.本文将从解答以下三个问题的角度来展开: 1.哪些内存需要回收? 2.什么时候回收? 3.如何回收? 话不多说,直接开始. 一.哪些内存需要回收? 根据之前的介绍,Java内存其实可分为两种类型: 一种是线程私有的,包括程序计数器.虚拟机栈和本地方法栈,这类内存在编译期就已经知道需要分配多少内存,且随线程而生,随线程而灭,所以在方法或线程结束时,内存就会跟着被回收:另一种是线程共…
1.前言 垃圾收集器是前一章垃圾收集算法理论知识的具体实现了,不同虚拟机所提供的垃圾收集器可能会有很大差别,另外我们必须提前说明一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器.这也是HotSpot为什么要实现这么多收集器的原因,下面我们以HotSpot为例讲解.在写之前,先介绍几个概念. 1.1.并行和并发的区别 这个区别之前在你专门的一节介绍过,这里再重点提一下:这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,可以这么理解这两个名词: 1…