JVM系列-第16章-垃圾回收器
垃圾回收器GC分类与性能指标垃圾收集器分类按线程数分可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。 并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“stop-the-world”机制。 按工作模式分可以分为并发式垃圾回收器和独占式垃圾回收器 并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。 独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。 按碎片处理方式分按碎片处理方式分,可分为压缩武垃圾回收器和非压缩式垃圾回收器。 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。 非压缩式的垃圾回收器不进行这步操作。 按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。 评估GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例(总运行时间 = 程序的运行时间 + 内存回收的时间) ...
JVM系列-第16章-垃圾回收器
垃圾回收器GC分类与性能指标垃圾收集器分类按线程数分可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。 并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“stop-the-world”机制。 按工作模式分可以分为并发式垃圾回收器和独占式垃圾回收器 并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。 独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。 按碎片处理方式分按碎片处理方式分,可分为压缩武垃圾回收器和非压缩式垃圾回收器。 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。 非压缩式的垃圾回收器不进行这步操作。 按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。 评估GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例(总运行时间 = 程序的运行时间 + 内存回收的时间) ...
JVM系列-第14章-垃圾回收相关算法
垃圾回收相关算法垃圾回收概念主要关注的是黄色部分,内存的分配与回收 什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。 大厂面试题蚂蚁金服 你知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和G1? JVM GC算法有哪些,目前的JDK版本采用什么回收算法? G1回收器讲下回收过程GC是什么?为什么要有GC? GC的两种判定方法?CMS收集器与G1收集器的特点 百度 说一下GC算法,分代回收说下 垃圾收集策略和算法 天猫 JVM GC原理,JVM怎么回收内存 CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么? 滴滴Java的垃圾回收器都有哪些,说下g1的应用场景,平时你是如何搭配使用垃圾回收器的 京东 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1, 包括原理,流程,优缺点。垃圾回收算法的实现原理 阿里 讲一讲垃圾回收算法。 什么情况下触发垃圾回收? 如何选择合 ...
JVM系列-第13章-StringTable
StringTableString的基本特性 String:字符串,使用一对 ” ” 引起来表示 String s1 = “mogublog” ; // 字面量的定义方式 String s2 = new String(“moxi”); string声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示string可以比较大小 string在jdk8及以前内部定义了final char[] value用于存储字符串数据。JDK9时改为byte[] 为什么JDK9改变了结构String类的当前实现将字符存储在char数组中,每个字符使用两个字节(16位)。从许多不同的应用程序收集的数据表明,字符串是堆使用的主要组成部分,而且,大多数字符串对象只包含拉丁字符。这些字符只需要一个字节的存储空间,因此这些字符串对象的内部char数组中有一半的空间将不会使用。 我们建议改变字符串的内部表示class从utf - 16字符数组到字节数组一个encoding-flag字段。新的String类将根据字符串的内容 ...
JVM系列-第8章-对象实例化内存布局与访问定位
对象实例化内存布局与访问定位对象实例化面试题 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? Java对象头有什么? 从对象创建的方式 和 步骤开始说 对象创建方式 new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法 Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器 Constructor的newInstance(XXX):反射的方式,可以调用空参的,或者带参的构造器 使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone接口 使用序列化:序列化一般用于Socket的网络传输 第三方库 Objenesis 创建对象的步骤判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化。(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + ...
JVM系列-11章-本地方法接口
本地方法接口什么是本地方法简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “c” 告知c++编译器去调用一个c的函数。 “A native method is a Java method whose implementation is provided by non-java code.”(本地方法是一个非Java的方法,它的具体实现是非Java代码的实现) 在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。 举例说明Native方法是如何编写的 123456789101112package com.zzc.hankz.jvm;public class IhaveNatives ...
JVM系列-第9章-直接内存 Direct Memory
直接内存 Direct Memory不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 使用下列代码,直接分配本地内存空间 12int BUFFER = 1024*1024*1024; // 1GBByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER); 非直接缓存区和缓存区原来采用BIO的架构,我们需要从用户态切换成内核态 NIO的方式使用了缓存区的概念 存在的问题也可能导致outofMemoryError异常 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和 ...
JVM系列-第7章-方法区
方法区运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈、堆、方法区的交互关系下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存放在Java栈的局部变量表中 new Person():存放在Java堆中 方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于Java堆的内存空间。 方法区主要存放的是 Class,而堆中主要存放的是 实例化的对象 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。 方法区的大小决定了系统可以保存多 ...
JVM系列-第12章-执行引擎
执行引擎执行引擎概述执行引擎属于JVM的下层,里面包括 解释器、JIT编译器、垃圾回收器 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。 那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。 执行引擎的工作流程 执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器。 每当执行完一项指令操作后,PC寄存器就会更新下一条需要被 ...
JVM系列-第6章-堆
堆堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。 -Xms10m:最小堆内存 -Xmx10m:最大堆内存 下图就是使用:Java VisualVM查看堆空间的内容,通过 jdk bin提供的插件 《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocat ...