![](https://img-blog.csdnimg.cn/20201010124743313.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
Java虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,实现了一次编写 ,到处运行。
博_采_众_长
理论与实践并行!
展开
-
JVM -- 宝典合集
各种好资源集合,转载系列!转载于是Yes呀 – JVM的那些事儿1、深度揭秘垃圾回收底层,这次让你彻底弄懂她原创 2020-11-19 15:34:44 · 122 阅读 · 0 评论 -
字符串常量池和运行时常量池是在堆还是在方法区?
文章目录1)方法区包含哪些内容?2)运行时常量池存在什么地方?3)取消永久代后,方法区的实现?4)字符串常量池和运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充 我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。1)方法区包含哪些内容?方法区包含哪些内容,摘录自《java虚拟机规转载 2020-11-03 14:16:49 · 14178 阅读 · 25 评论 -
Java逃逸分析之栈上分配内存
目录 什么是逃逸分析?栈上分配内存 什么是逃逸分析? 在很早以前,Java代码从编写完毕到JVM执行至少需要两个过程: javac将Java代码编译成字节码class文件。JVM载入class文件后,由解释器来逐条将字节码指令解释翻译成本地机器码并执行。 因此,Java也被称为是一门”解释执行“的语言,由于解释执行比编译执行要慢,所以”Java程序很慢“在早期深入人心。 为了解决“解释执行”的效率问题,Java引入了JIT即时编译器,当JVM发现某段代码块运行的特别频繁时就会将这部分热点代..转载 2020-10-31 21:39:23 · 203 阅读 · 2 评论 -
JVM -- 再谈类的加载器
本系列文章都转载于知乎:是龙弟弟呀JVM – 再谈类的加载器再谈类的加载器概述类加载器是 JVM 执行类加载机制的前提ClassLoader 的作用:ClassLoader 是 Java 的核心组件,所有的 Class 都是由 ClassLoader 进行加载的,ClassLoader 负责通过各种方式将 Class 信息的二进制数据流读入 JVM 内部,转换为一个与目标类对应的 java.lang.Class 对象实例。然后交给 Java 虚拟机尽心链接、初始化等操作。因此,ClassLoader.转载 2020-10-28 20:56:14 · 614 阅读 · 1 评论 -
JVM -- 类的加载过程详解
本系列文章都转载于知乎:是龙弟弟呀JVM – 类的加载过程详解类的加载过程详解概述在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载按照 Java 虚拟机规范,从 Class 文件到加载到内存中的类,到类卸载出内存位置,它的整个生命周期包括如下七个阶段:其中,验证、准备、解析3个部分统称为链接(Linking)从程序中类的使用过程看:大厂面试题蚂蚁金服:描述一下 JVM 加载 Class 文件的原理机制?一面:类加载过程百度:类加载的.转载 2020-10-28 20:47:51 · 822 阅读 · 4 评论 -
JVM -- 字节码指令集与解析举例
本系列文章都转载于知乎:是龙弟弟呀JVM – 字节码指令集与解析举例字节码指令集与解析举例概述Java 字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行命令Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成,由于 Java 虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码由于限制了 Java 虚拟机操作码的长度为一个字节(即0~2.转载 2020-10-28 20:40:55 · 444 阅读 · 2 评论 -
JVM -- Class文件结构
本系列文章都转载于知乎:是龙弟弟呀JVM – Class文件结构Class 文件结构概述字节码文件的跨平台性Java 语言,跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译 这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp 等有强大的解释器 跨平台似乎已经快称为一门语言必选的特性 Java 虚拟机:跨语言的平台 Java 虚拟机不和包括 Java 在内的任何语言绑定,它只与".转载 2020-10-28 17:37:32 · 388 阅读 · 0 评论 -
JVM -- GC Roots
JVM – GC Roots在Java语言中,GC Roots 包含以下以下几类元素:虚拟机栈中引用的对象 ✔比如:各个线程被调用的方法中使用到的参数、局部变量等本地方法栈被JNI(通常的说法)引用的对象方法区中类静态属性引用的对象 ✔比如:Java类的引用类型静态变量方法区中常量引用的对象 ✔比如:字符串常量池(String Table)原创 2020-10-26 20:23:09 · 198 阅读 · 0 评论 -
JVM -- StringTable(大师,我悟了)
JVM – StringTable(大师,我悟了)一、String的基本特性String:字符串,使用一对“”引起来表示 ✔String s1 = “Hello”;//字面量的定义方式 ✔String s2 = new String(“Hello”);String声明为final的,不可被继承的String实现了Seria原创 2020-10-26 19:33:18 · 196 阅读 · 4 评论 -
JVM -- 执行引擎(一文读懂版)
JVM – 执行引擎一、概述执行引擎是Java虚拟机核心的组成部分之一“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的, 因此可以不受物理条件限制地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码原创 2020-10-26 10:17:40 · 184 阅读 · 2 评论 -
JVM --直接内存概述
JVM --直接内存概述简单理解:java process memory = java heap + native memory不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存空间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高 ✔原创 2020-10-25 19:52:41 · 206 阅读 · 2 评论 -
JVM -- 对象的内存布局
JVM – 对象的内存布局内存布局1️⃣对象头(Header) 包含两部分 运行时数据区(Mark World) &nbs原创 2020-10-25 16:24:54 · 169 阅读 · 0 评论 -
JVM --方法区(超详细)
JVM --方法区(超详细)运行时数据区结构图栈、堆、方法区的交互关系方法区看作是一块独立与Java堆的内存空间方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfM原创 2020-10-25 15:36:31 · 1314 阅读 · 2 评论 -
JVM -- 基于逃逸分析的代码优化技术(详解)
JVM – 基于逃逸分析的代码优化技术(详解)栈上分配 将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向对象的指针永远不会逃逸,对象可能是栈上分配的首选,而不是堆分配。同步省略 如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。分离对象或标量替换 有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象原创 2020-10-25 10:41:59 · 164 阅读 · 0 评论 -
JVM堆空间 -- 分配担保机制
JVM堆空间 – 分配担保机制 在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果大于,则此次Minor GC是安全的如果小于,则虚拟机会查看-XX:HandlePromotionFailure设置值是否允许担保失败。 ✔如果HandlePromotionFailure=true,那么会继续检查老年原创 2020-10-24 21:09:41 · 633 阅读 · 0 评论 -
测试堆空间常用的JVM参数
测试堆空间常用的JVM参数/** * 测试堆空间常用的jvm参数: * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值 * -XX:+PrintFlagsFinal :查看所有的参数的最终值(可能会存在修改,不再是初始值) * 具体查看某个参数的指令: jps:查看当前运行中的进程 * jinfo -flag SurvivorRatio 进程id * * -Xms:初始堆空间内存 (默认为物理内原创 2020-10-24 20:38:31 · 130 阅读 · 0 评论 -
Minor GC、Major GC、Full GC(详解)
Minor GC、Major GC、Full GC(详解) JVM在进行GC时,并非每次都对三个内存(新生代、老年代;方法区)区域一起回收的,大部分时候回收的都是指新生代。针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆回收(Full GC)部分收集: 不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(Minor G原创 2020-10-24 20:15:10 · 1681 阅读 · 1 评论 -
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
转载地址:http://www.cnblogs.com/paddix一、JVM 内存模型根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩转载 2020-10-23 17:54:01 · 189 阅读 · 0 评论 -
StringTable详解
一、存储结构 jdk8及以前String底层使用char[],一个char是两个字节,jdk9开始改用byte[]加上编码标记节约空间。 jdk9官网提供的String修改说明:http://openjdk.java.net/jeps/254 修改动机: 二、不可变性 1、当对字符串重新赋值时,需要重写指定内存区域赋值 2、当对现有字符串进行连接操作时,也需要重新指定内存区...转载 2020-10-22 13:06:34 · 679 阅读 · 0 评论 -
分代收集算法、增量收集算法、分区收集算法
目录 1.分代收集算法2.增量收集算法3.分区收集算法 1.分代收集算法 前面讲到的标记-清除算法、复制算法、标记-压缩算法,都有优缺点,没有一种算法是最好的。JAVA将堆分为新生代和老年代,这样可以根据各个年代的特点的不同使用不同的算法。 在新生代中使用复制算法,在老年代中使用标记-清除算法或者标记-压缩算法,或者两者的结合。(这就是所谓的分代收集算法) CMS是基于标记-回收算法实现的,回收效率高,对于碎片问题,采用的是基于标记-整理算法的Serial Old回收器作为补偿措施。 2...转载 2020-10-19 08:11:06 · 382 阅读 · 0 评论 -
JVM -- Garbage First(G1垃圾收集器)
Garbage First介绍本文摘自《构建高性能的大型分布式Java应用》一书,Garbage First简称G1,它的目标是要做到尽量减少GC所导致的应用暂停的时间,让应用达到准实时的效果,同时保持JVM堆空间的利用率,将作为CMS的替代者在JDK 7中闪亮登场,其最大的特色在于允许指定在某个时间段内GC所导致的应用暂停的时间最大为多少,例如在100秒内最多允许GC导致的应用暂停时间为1秒,这个特性对于准实时响应的系统而言非常的吸引人,这样就再也不用担心系统突然会暂停个两三秒了。G1要做到这样的效果转载 2020-10-19 08:10:51 · 114 阅读 · 2 评论