JVM
文章平均质量分 83
多一天,多一点
这个作者很懒,什么都没留下…
展开
-
JVM—垃圾收集器详细介绍
JVM—垃圾收集器详细介绍7大垃圾收集器间的相互关系及说明两个收集器间有连线,表明它们可以搭配使用: Serial—Serial Old、Serial—CMS、 ParNew—Serial Old、ParNew—CMS、 Parallel Scaveng—Serial Old、Parallel Scavenge—Parallel Old、G1;其中Serial Old作为CMS 出现"Concurrent Mode Failure"失败的后备垃圾收集器。因为CMS是并发的垃圾收集器,当内原创 2020-07-12 16:02:20 · 516 阅读 · 0 评论 -
JVM—引用类型
JVM—引用类型Java里面的引用定义比较传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址, 就称该reference数据是代表某块内存、 某个对象的引用。但是这个引用的定义,其实很笼统,虽然可能明白引用是什么意思,但是想一想如果对象只有引用跟没有被引用两种状态,有点狭隘。我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。 -【既偏门又非常高频的面试题】强引用、软引用、弱引用、虚引用有什么区别?具原创 2020-07-12 15:55:15 · 178 阅读 · 0 评论 -
JVM—垃圾收集器概述
JVM—垃圾收集器概述一、GC的分类垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。1.1 按线程数分在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以,串行回收默认被应用在客户端的Client模式下的JVM中在并发能力比较强的CPU上,并行回收器产生的停顿时原创 2020-07-12 15:51:55 · 116 阅读 · 0 评论 -
JVM—垃圾回收相关概念补充
JVM—垃圾回收相关概念补充一、System.gc()在默认情况下,通过System.gc ()或者Runtime . getRuntime() .gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。手动调用System.gc()后,GC不一定会立马执行垃圾回收操作。JVM实现者可以通过system.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收原创 2020-07-12 15:48:29 · 124 阅读 · 0 评论 -
JVM—HotSpot的算法细节实现
HotSpot的算法细节实现一、根节点枚举当前的JVM虽然在进行可达性分析时可以做到与用户线程并发执行,但是在根节点枚举时还是会导致STW (Stop The World),即暂时挂起所有用户线程。但根节点枚举始终还是必须在一个能保障一致性的快照中才得以进行(“一致性”的意思是整个枚举期间执行子系统看起来就像被冻结在某个时间点上, 不会出现分析过程中, 根节点集合的对象引用关系还在不断变化的情况), 若这点不能满足的话, 分析结果准确性也就无法保证。 这是导致垃圾收集过程必须停顿所有用户线程的其中一个原创 2020-07-12 15:47:35 · 436 阅读 · 0 评论 -
JVM—类加载机制
一、概述类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识;ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎(Execution Engine)决定加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)二、类加载过程加载、 验证、 准备、 初始化和卸载这五个阶段的顺序是确定的, 类型的加载过程必原创 2020-07-12 15:36:56 · 161 阅读 · 0 评论 -
JVM—日志参数
一、概述阅读分析虚拟机和垃圾收集器的日志是处理Java虚拟机内存问题必备的基础技能,下面列举一下学习过程中所接触到的日志参数-XX:+PrintGC:输出Gc日志。类似: 一verbose:gcjdk9后使用:-Xlog:gc-XX:+PrintGCDetails:输出GC的详细日志JDK 9之后使用-X-log: gc*-XX: +PrintGCTimeStamps:输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps:输出GC的时间戳(以日期的形式,如2原创 2020-07-12 15:33:57 · 622 阅读 · 1 评论 -
JVM—架构图
原创 2020-07-10 21:19:55 · 156 阅读 · 0 评论 -
JVM—垃圾收集算法
一、概述垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收 集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。关于垃圾回收,需要思考三个问题: 哪些内存需要回收? 什么时候回收? 如何回收?1.1什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。外文: An object is considered garbage原创 2020-07-09 17:43:29 · 295 阅读 · 0 评论 -
JVM—执行引擎
一、概述执行引擎是Java虚拟机的核心组成部分之一。虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、原创 2020-07-09 17:39:21 · 270 阅读 · 0 评论 -
运行时数据区域—本地方法栈
本地方法栈与虚拟机栈基本一样,只不过是虚拟机栈是用来为虚拟机执行Java代码(也就是字节码)服务的,当虚拟机用到本地方法时,则会使用本地方法栈提供服务。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态拓展的内存大小。(在内存溢出方面与虚拟机栈是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内..原创 2020-07-09 17:31:04 · 92 阅读 · 0 评论 -
JVM—运行时数据区域面试题
百度三面:说一下JVM内存模型吧,有哪些区?分别干什么的?蚂蚁金服:Java8的内存分代改进JVM内存分哪几个区,每个区的作用是什么?一面: JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?二面: Eden和Survior的比例分配小米:jvm内存分区,为什么要有新生代和老年代字节跳动:二面: Java的内存分区二面:讲讲jvm运行时数据库区什么时候对象会进入老年代?京东:JVM的内存结构,Eden和Survivor比例 。JVM内存为什么要分成原创 2020-07-05 13:48:55 · 236 阅读 · 0 评论 -
JVM—直接内存
JVM—直接内存直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分, 也不是《Java虚拟机规范》 中定义的内存区域。但是这部分内存也被频繁地使用, 而且也可能导致OOM异常出现使用Java代码从直接内存中开辟空间public class DirectMemoryTest { /**1GB */ private static final int BUFFER = 1024 * 1024 * 1024; public static voi原创 2020-07-05 13:48:10 · 104 阅读 · 0 评论 -
JVM—堆中Java对象分配、布局和访问的全过程
一 、对象的创建1.1 创建对象的几种方式使用new使用Class 类的 newInstance()使用Constructor类的newInstance()实现Cloneable接口并重写clone()方法使用反序列化2.2 JVM层面创建对象的过程判断对象对应的类是否加载、链接、初始化为对象分配内存内存绝对规整,采用“指针碰撞”;不规整采用“空闲列表”处理并发安全问题将分配到的内存空间(但不包括对象头)都初始化为零值设置对象的对象头调用Class原创 2020-07-05 13:46:11 · 990 阅读 · 2 评论 -
运行时数据区域—方法区
一、方法区概述以Person person = new Person()为例,看一下栈、堆、方法区(元空间)之间的关系《Java虚拟机规范》中明确说明:‘尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。’但对于HotSpot而言,方法区还有一个别名叫做Non-heap(非堆),目的就是要和堆分开。所以,方法区可以看作是一块独立于Java堆的内存空间。1.1 方法区的不同版本在jdk7及以前,习惯上把方法区称为永久代。jdk8开始,使用元空间取代了原创 2020-07-05 13:34:02 · 270 阅读 · 0 评论 -
JIT—逃逸分析
逃逸分析(JIT的优化之一)一、 概述在JVM中,对象实例是在堆中开辟内存,这是一个共识。但是有一个特殊情况,如果一个对象经过逃逸分析后,发现作用域只在方法内部有效,则这个对象就很可能在Java虚拟机栈上开辟内存,极大地提高了对象分配内存的性能,这样就不会有GC的可能性了。简单来说,逃逸分析是JVM中JIT的性能优化技术,用来分析对象是否发生逃逸,而栈上分配、同步消除、标量替换是具体的优化手段。逃逸分析的基本原理:分析对象的动态作用域一个变量在方法中被定义,它可能被外部的方法所引用,比如作为返原创 2020-07-01 12:57:32 · 1206 阅读 · 0 评论 -
运行时数据区域—堆
一、 核心概述JVM中一个实例进程对应一个运行时数据区域,实例进程又包含多个线程,这些线程共享堆、方法区,而程序计数器、Java虚拟机栈和本地方法栈是线程私有的。一个JVM实例对应一个堆内存,堆也是JVM内存管理的核心区域因为运行时数据区域在一个实例创建的时候随之被创建,所以堆区也随之被创建,其初始化大小和最大大小在运行时不可改变堆区是JVM管理的最大的一块内存空间,《Java虚拟机规范》中规定堆区物理内存中可以不连续,但是在逻辑内存中被视为是连续的所有线程共享堆区,在堆区中还可以划分出来线程私原创 2020-07-01 12:48:17 · 319 阅读 · 0 评论 -
运行时数据区域—虚拟机栈
一、概述 Java虚拟机中,每个线程的启动都会相应的开辟一个Java虚拟机栈,所以Java虚拟机栈的生命周期和线程是同步的,它也是线程私有的。虚拟机栈中的存储单位是栈帧(Stack Frame ),当线程执行方法的时候,就会在虚拟机栈中创建一个栈帧用来存储当前方法相关的数据(如下图),当方法执行完后就会进行栈帧出栈操作。一条活动线程在某一个时间点上,只会有一个活动的栈帧,即只有当前正在执行方法的栈帧(栈顶栈帧)是有效的,被称作当前栈帧,与之对应的方法,那它就是当前方法,他所在的类就是当前类。由于栈的原创 2020-07-01 12:17:15 · 191 阅读 · 0 评论 -
运行时数据区域—程序计数器
程序计数器是一块占用内存很小的空间区域,它也是唯一 一个在《Java虚拟机规范》中没有规定任何OOM情况的区域。它就是用来记录字节码行号的。 Java虚拟机是支持多线程的,线程切换时就需要记录每个线程所执行到哪一行代码,此时就需要程序计数器来记录行号,以保证在线程的下次执行能够找到正确的执行位置。这也是程序计数器必须是线程私有的原因。 需要说明一下:如果线程正在执行的是一个Java方法,此时程序计数器中的值为字节码的行号;如果线程正在执行的是Native方法,此时程序计数器中的值为Unde原创 2020-07-01 12:02:23 · 142 阅读 · 0 评论