JVM
文章平均质量分 80
JVM从入门到精通
~Maple~
帅
展开
-
JVM与Java体系结构
JVM与Java体系结构 一、前言 大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。 一、程序员如何看待上层框架 一些有一定工作经验的开发人员,打心眼里觉得SSM、微服务等上层技术才是重点,基础知识并不重要,这其实是一种本末倒置的“病态”。 如果我们把核心类库的API比作数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。 计算机体系对我们来说越来越远,但不了解底层实现方式的前提下,通过高级语言很容易编写程序代原创 2021-01-13 10:40:46 · 116 阅读 · 0 评论 -
类加载子系统
类加载子系统 一、内存结构概述 二、类加载器与类的加载过程 一、类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。 CLassLoader只负责class文件的加载,至于他是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了累的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分信息是 Class 文件中常量池部分的内存映射)。 二、类加载器Cla原创 2021-01-13 16:25:06 · 96 阅读 · 0 评论 -
运行时数据区概述及线程
运行时数据区概述及线程 一、概述 一、JVM内存概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统个应用程序的实时运行。JVM内存布局规定了Java下运行过程中内存申请、分配、管理和策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。 Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的原创 2021-01-15 12:14:28 · 76 阅读 · 0 评论 -
程序计数器
程序计数器 一、PC Register介绍 JVM中的程序计数器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。 作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引原创 2021-01-16 10:11:15 · 969 阅读 · 0 评论 -
虚拟机栈
虚拟机栈 一、虚拟机栈概述 一、虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器实现容易,缺点是性能下降,实现同样的功能需要更多的指令。 二、初步印象 有不少Java开发人员一提到Java内存结构,就会非常粗粒度的将JVM中的内存区理解仅为Java堆(heap)和Java栈(stack)?为什么? 栈式运行时的单位,而堆是存储的单位。 即:栈解决程序的运行问题,即程序如何执行,或者说如原创 2021-01-19 14:23:50 · 314 阅读 · 2 评论 -
本地方法接口
本地方法接口 一、什么是本地方法 简单地讲,一个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原创 2021-01-20 17:37:01 · 192 阅读 · 0 评论 -
本地方法栈
本地方法栈 一、本地方法栈 Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个 StackOverflowError 异常。 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个OutOf原创 2021-01-21 17:44:54 · 1565 阅读 · 0 评论 -
堆
堆 一、堆(Heap)的核心概述 一、堆的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。 《Java虚拟机规范》规定,堆可以处理物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer, TLAB)。 《Java虚拟机规范》原创 2021-01-22 15:20:39 · 243 阅读 · 0 评论 -
方法区
方法区 一、栈、堆、方法区的交互关系 二、方法区的理解 一、方法区在哪里? 《Java虚拟机规范》中明确说明:”尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾回收或者进行压缩。“但对于HotSpot JVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看做是一块独立于Java堆的内存空间。 二、方法区的基本理解 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。 方法区在JVM启动的时候被创建,并且原创 2021-01-24 11:15:37 · 647 阅读 · 0 评论 -
对象的实例化、内存布局和访问定位
对象的实例化、内存布局与访问定位 一、对象的实例化 一、大厂面试题 美团: 对象的JVM中是怎么存储的? 对象头信息里面有哪些东西? 蚂蚁: java对象头里有什么? 二、对象的实例化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EgENILr-1611458173425)(对象的实例化、内存布局和访问定位.assets/image-20210124094454492.png)] 三、创建对象的步骤 前面所述是从字节码角度看待对象的创建过程,现在从执行步原创 2021-01-24 11:21:47 · 94 阅读 · 0 评论 -
执行引擎
执行引擎 一、执行引擎概述 一、执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理机、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集和执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅原创 2021-01-24 22:02:49 · 163 阅读 · 0 评论 -
String Table
String Table 一、String的基本特征 一、String的基本特征 String:字符串,使用一对“ “ 引起来表示。 String声明为final的,不可被继承。 String 实现了Serializable:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小。 String在jdk8及之前内部定义了final char[] value用于存储字符串数据。jdk9时改为了byte[]。 二、String在jdk9中存储结构变更 结论:String再也原创 2021-01-25 10:50:31 · 217 阅读 · 0 评论 -
垃圾回收概述
垃圾回收概述 一、什么是垃圾 一、概述 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即时经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。 二、大厂面试题 蚂原创 2021-01-25 14:43:07 · 107 阅读 · 0 评论 -
垃圾回收相关算法
垃圾回收相关算法 一、垃圾标记阶段的算法之引用计数算法 一、垃圾标记阶段:对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象,只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉漆所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么JVM中究竟是如何标记一个死亡对象的呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象存活的方式一般有两种方式:引用计数算法和可达性分原创 2021-01-26 13:18:37 · 92 阅读 · 0 评论 -
垃圾回收相关概念
垃圾回收相关概念 一、System.gc()的理解 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而Syste.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。 JVM实现这可以通过System.gc()调用来决定给JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无需手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,原创 2021-01-28 10:26:31 · 216 阅读 · 0 评论 -
直接内存
直接内存 一、直接内存概述 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存时在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。 也可能导致OutOfMemoryError异常 由于直接内存在Java堆外,原创 2021-01-28 20:30:54 · 75 阅读 · 0 评论 -
垃圾回收器
垃圾回收器 一、GC分类与性能指标 一、垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的产商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代的过程中,因此Java发展至今已经衍生出了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 二、垃圾回收器分类 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,才是工作线程被暂停,直至垃圾收集工作结束。 在诸如单CPU处理器或者较小的引原创 2021-01-30 12:17:27 · 166 阅读 · 0 评论 -
Class文件结构
Class文件结构 一、概述 一、字节码文件的跨平台性 Java语言:跨平台的语言 当Java源代码成功编译成字节码后,如果想在不同平台上运行,则无需再次编译 这个优势已经不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的编译器。 跨平台似乎已经快成为一门语言必选的特性。 Java虚拟机:跨语言的平台 Java虚拟机不和包括 Java 在内的任何语言绑定,它只与 “Class 文件” 这种特定的二进制文件格式所关联,无论使用何种语言进行软件开发,只要能将源文件编原创 2021-02-05 15:25:47 · 320 阅读 · 0 评论 -
使用javap指令解析Class文件
使用javap指令解析Class文件 一、解析字节码的作用 通过反编译生成的字节码文件,我们可以深入了解java代码的工作机制。但是,自己分析类文件结构太麻烦了,除了使用第三方的jclasslib工具之外,Oracle官方也提供了工具:javap。 javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。 通过局部变量表,我们可以查看局部变量的作用、所在槽位等信息,甚至可以看到槽位复用等信原创 2021-02-05 15:27:36 · 574 阅读 · 4 评论