![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 89
JVM学习
游王子og
看不穿你所有的虚情假意,只触碰到你转瞬即逝的真心
展开
-
JVM(21):执行引擎概述、java代码编译和执行的过程、(机器码、指令、汇编语言)、解释器
一、执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价...原创 2021-11-10 22:18:08 · 870 阅读 · 0 评论 -
JVM(20):对象的实例化与创建步骤、对象的内存布局、对象的访问定位、直接内存
一、对象的实例化原创 2021-11-09 22:46:48 · 176 阅读 · 0 评论 -
JVM(19):StringTable为什么要调整?、静态变量放在哪里?、方法区的垃圾回收、运行时数据区总结
一、StringTable为什么要调整?jdk7中将stringTable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发。而full gc是老年代的空间不足、永久代不足时才会触发。这就导致stringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。二、静态变量放在哪里?staticobj随着Test的类型信息存放在方法区,instanceob...原创 2021-11-07 21:22:44 · 687 阅读 · 0 评论 -
JVM(18):运行时常量池、图示举例方法区的使用、方法区的演进细节
一、运行时常量池运行时常量池(Runtime constant Poo1)是方法区的一部分。常量池表(Constant Pool Table)是class文件的一部分,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。运行时常量池,在加载类和接口到虚拟机后,就会创建对应的运行时常量池。JVM为每个已加载的类型(类或接口)都维护一个常量池。池中的数据项像数组项一样,是通过索引访问的。运行时常量池中包含多种不同的常量,包括编译期...原创 2021-11-06 22:35:18 · 886 阅读 · 0 评论 -
JVM(17):Metaspace代码案例、方法区内部结构、Class文件中常量池
一、Metaspace代码案例 测试代码:package org.ywz.springbootdemo;import org.objectweb.asm.ClassWriter;import org.objectweb.asm.Opcodes;/** * 使用代码的方式创建类 * java8或以上:-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m * jdk6:-XX:PermSize=10m -XX:MaxPermSize...原创 2021-11-03 21:58:07 · 384 阅读 · 0 评论 -
JVM(16):(栈、堆、方法区的交互关系)、方法区的基本理解、Hotspot中方法区的演进、设置方法区大小与OOM
一、栈、堆、方法区的交互关系二、方法区的基本理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。所以,方法区看作是一块独立于Java堆的内存空间。 测试代码:package org.ywz.springbootdemo;/** * ...原创 2021-11-02 21:19:28 · 314 阅读 · 1 评论 -
JVM(15):逃逸分析、代码优化、堆空间小结
一、堆是分配对象存储的唯一选择吗?在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在...原创 2021-10-31 21:45:00 · 134 阅读 · 0 评论 -
JVM(14):内存分配策略、为对象分配内存:TLAB、堆空间参数设置
一、内存分配策略如果对象在Eden出生并经过第一次MinorGC后仍然存活,并且能被survivor容纳的话,将被移动到survivor空间中,并将对象年龄设为1 。对象在survivor区中每熬过一次MinorGc ,年龄就增加1 岁,当它的年龄增加到一定程度(默认为15岁,其实每个JVM、每个cc都有所不同)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过选项-XX:MaxTenuringThreshold来设置。针对不同年龄段的对...原创 2021-10-30 22:13:12 · 409 阅读 · 0 评论 -
JVM(13):(Minor GC、Major GC与Full GC)、GC举例与日志分析、堆空间分代思想
一、Minor GC、Major GC与Full GCJVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集( Partial GC) ,一种是整堆收集(FullGC)。部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(Minor Gc / Young Gc):只是新生代的垃圾收集。 老年代收集(...原创 2021-10-28 22:38:41 · 285 阅读 · 0 评论 -
JVM(12):图解对象分配过程
一、图解对象分配过程为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑Gc执行完内存回收后是否会在内存空间中产生内存碎片。new的对象先放伊甸园区。此区有大小限制。 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区 然后将伊甸园中的剩余对象移动到幸存者0原创 2021-10-26 21:35:03 · 414 阅读 · 0 评论 -
JVM(11):内存细分、设置堆内存大小、OOM说明与举例、新生代与老年代
一、内存细分二、设置堆内存大小Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,大家可以通过选项"-Xmx"和"一Xms"来进行设置。“-xms"用于表示堆区的起始内存,等价于-XX: InitialHeapsize “-xmx则用于表示堆区的最大内存,等价于-XX:MaxHeapsize一旦堆区中的内存大小超过“-Xmx"所指定的最大内存时,将会抛出OutOfMemoryError异常。通常会将 -...原创 2021-10-24 22:06:24 · 1470 阅读 · 0 评论 -
JVM(10):堆空间概述、对象创建和GC概述
一、堆空间概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区( ThreadLocal Allocation Buffer, TLAB)。查看JVM内存 ...原创 2021-10-22 22:09:26 · 206 阅读 · 0 评论 -
JVM(9):本地方法接口、本地方法栈
一、本地方法接口什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如c。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在c++中,你可以用extern"c"告知C++编译器去调用一个c的函数。"native method is a Java method whose implementation isprovi...原创 2021-10-21 21:54:34 · 116 阅读 · 0 评论 -
JVM(8):方法重写的本质、虚方法表、方法返回地址、虚拟机栈相关面试题
一、方法重写的本质Java 语言中方法重写的本质:找到操作数栈顶的第一个元素所执行的对象的实际类型,记作c. 如果在类型c中找到与常量中的描述符合简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束:如果不通过,则返回java.lang.IllegalAccessError异常。 否则,按照继承关系从下往上依次对c的各个父类进行第⒉步的搜索和验证过程。 如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodErro...原创 2021-10-20 22:04:21 · 505 阅读 · 0 评论 -
JVM(7):动态链接、方法的调用、四种方法调用指令区分非虚方法和虚方法、invokedynamic指令的使用
一、动态链接每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接( Dynamic Linking)。比如: invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用( symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了...原创 2021-10-13 21:48:27 · 287 阅读 · 0 评论 -
JVM(6):Slot变量槽、操作数栈、代码追踪、栈顶缓存技术
一、Slot变量槽的理解参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束。局部变量表,最基本的存储单元是slot(变量槽)局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference), returnAddress类型的变量。在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。byte...原创 2021-10-12 21:08:07 · 641 阅读 · 0 评论 -
JVM(5):虚拟机栈、栈异常、栈的存储结果和运行原理、栈内部结构、局部变量表
一、虚拟机栈由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?为什么?栈是运行时的单位,而堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或...原创 2021-10-11 21:38:26 · 236 阅读 · 0 评论 -
JVM(4):类的主动使用与被动使用、运行时数据区域内部结构、JVM线程说明、PC寄存器
一、类的主动使用与被动使用在JVM中表示两个class对象是否为同一个类存在两个必要条件:类的完整类名必须一致,包括包名。 加载这个类的classLoader(指classLoader实例对象)必须相同。换句话说,在JVM中,即使这两个类对象(class对象)来源同一个class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。JVM必须知道一个类型是由启动加载器加载的还是由用户类加载...原创 2021-10-09 22:48:01 · 207 阅读 · 0 评论 -
JVM(3):类加载器分类、双亲委派机制
一、类加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined classLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类classLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:...原创 2021-10-08 22:16:30 · 142 阅读 · 0 评论 -
JVM(2):内存结构、类的加载过程
一、内存结构概述类加载器子系统class文件进入到虚拟机后,首先进行Loading(加载)然后Linking(链接)最后进行初始化。 加载使用的加载器分为:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)、Application ClassLoader(应用类加载器)。 连接分为:Verify(验证)、Prepare(准备)、Resolve(解析)。内存区域PC Registers(PC寄存器或程序计数器,.原创 2021-10-07 21:32:57 · 204 阅读 · 0 评论 -
JVM(1):介绍、结构、运行和生命周期
一、虚拟机 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟计算机指令。大体上虚拟机可分为系统虚拟机和程序虚拟机。大名鼎鼎的Visual Box,VMWare就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。 程序虚拟机的一个典型代表就是java虚拟机,它专门为执行单个计算机程序而设计,在java虚拟机中执行的指令我们称为java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上...原创 2021-10-06 22:40:46 · 153 阅读 · 0 评论