![](https://img-blog.csdnimg.cn/c106a8b2b33e40cb81bd9d0cc62e6aed.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm
文章平均质量分 66
java 虚拟机
959y
奋斗ing
展开
-
Java的本地内存 直接内存 元空间
Java的本地内存和直接内存和元空间的分析原创 2022-12-02 17:24:01 · 688 阅读 · 0 评论 -
JVM调优参数
jvm 调优参数的说明原创 2022-05-29 15:40:16 · 2263 阅读 · 0 评论 -
谈谈ZGC_分区垃圾回收器
文章目录1.ZGC 概述2.内存多重映射3.染色指针3.1 三色标记3.2 染色指针4.内存布局5.读屏障6.GC 过程6.1 初始标记6.2 并发标记6.3 在标记6.4 初始转移6.5 并发转移6.6 重定位7.垃圾收集算法8.总结1.ZGC 概述ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在 JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正式投入生产使用原创 2022-03-04 22:04:38 · 592 阅读 · 0 评论 -
JVM 面试 [25]
1.什么是JVM内存结构2.什么是JVM内存模型3.heap和stack的区别4.什么情况下会发生内存溢出5.谈谈对oom的认识,以及如何排查oom问题6.谈谈jvm的常量池7.如何判断一个对象是否存活8.强软弱虚引用9.被引用的对象一定存活吗10.垃圾回收器11.CMS12.G113.垃圾回收算法14.jvm中一次完整的垃圾回收过程15.Minor GC和Full GC16.空间分配担保原则17.类加载和类加载的过程18.类加载器19.双亲委派机制20.为什么要打破双原创 2022-01-26 00:16:11 · 1059 阅读 · 0 评论 -
jvm垃圾回收器
文章目录0、垃圾回收算法1、垃圾回收器的分类2、串行垃圾回收器3、吞吐量优先4、响应时间优先5、G1(Garbage First,jdk9默认)6、Full GC0、垃圾回收算法1.标记清除2.标记复制3.标记整理内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)内存整齐度:复制算法=标记清除算法>标记压缩算法内存利用率:复制算法<标记清除算法=标记压缩算法年轻代:存活率低复制算法老年代:区域大,存活率高标记清除(内存碎片不是太多)+标原创 2021-12-08 18:52:35 · 293 阅读 · 0 评论 -
CMS 和G1 的区别 [24]
CMS收集器和G1收集器的区别文章目录区别一: 使用范围不一样区别二: STW的时间区别三: 垃圾碎片区别四: 垃圾回收的过程不一样CMS回收垃圾的4个阶段CMS的总结和优缺点G1回收器的特点G1回收垃圾的4个阶段什么情况下应该考虑使用G1控制G1回收垃圾的时间区别一: 使用范围不一样CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二: STW的时间CMS收集器以最小的停顿时间为目标的收集器。原创 2021-09-20 17:37:56 · 2361 阅读 · 3 评论 -
volatile为什么不能保证原子性
首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢?可见性可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量进行修改,那么这个线程拿到的值是主存中未被修改的值,这就是可见性的问题。volatile很好的保证了变量的可见原创 2021-07-09 14:58:03 · 382 阅读 · 0 评论 -
Object o = new Object()在内存中占了多少字节
一、 结论maven<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version></dependency>测试public class ObjectLayOutTest { public static void ma原创 2021-07-09 09:28:07 · 312 阅读 · 4 评论 -
深入解析JMM
概念 Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。特性原子性指一个操作是不可中断的,即使是多个线程一起执行的时候,一个原创 2021-04-06 19:32:29 · 130 阅读 · 0 评论 -
jvm之操作数栈
Runtime data Area什么是操作数栈?与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为int。数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈。java虚拟机栈是方法调用和执原创 2021-03-28 22:06:47 · 557 阅读 · 0 评论 -
JVM_08 执行引擎_1
执行引擎:翻译:将字节码翻译为os可以识别的机器指令这里有前端编译和后端编译前端编译为.java -> .class后端编译为执行引擎.class编译为机器指令原创 2021-03-16 22:03:26 · 186 阅读 · 0 评论 -
JVM_13 字节码跨平台性与执行细节举例
想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。javac是一种能够将Java源码编译为字节码的前端编译器。Javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤,分别是词法解析、语法解析、语义解析以及生成字节码。一个语言是否高效(程序性能是否高效),跟语言本身并没有太大关系,主要有关系的是编译器,java语...原创 2021-03-16 15:55:30 · 197 阅读 · 0 评论 -
JVM_07 运行时数据区4-对象的实例化内存布局与访问定位
文章目录1.对象的实例化2. 对象的内存布局3.对象的访问定位1.对象的实例化1.new最常见的方式变形1 : Xxx的静态方法变形2 : XxBuilder/XxoxFactory的静态方法Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求使用clone() :不调用任何构造器,当前类需要实现Cloneable接原创 2021-03-15 21:47:08 · 144 阅读 · 1 评论 -
JVM_05 运行时数据区2-堆_2
文章目录1.图解对象分配过程2.Minor GC、Major GC、Full GC3.TLAB(线程私有缓存区域)1.图解对象分配过程特殊情况public class HeapInstanceTest { byte[] buffer = new byte[new Random().nextInt(1024 * 200)]; public static void main(String[] args) { ArrayList<HeapInstanceTest&原创 2021-03-14 21:26:37 · 156 阅读 · 0 评论 -
JVM_05 运行时数据区2-堆_1
文章目录1.堆的细分内存结构2.设置堆内存大小与OOM3.年轻代与老年代1.堆的细分内存结构JDK 7以前: 新生区+养老区+永久区Young Generation Space:又被分为Eden区和Survior区 Young/NewTenure generation Space: Old/TenurePermanent Space: PermJDK 8以后: 新生区+养老区+元空间Young Generation Spac原创 2021-03-14 21:17:44 · 129 阅读 · 1 评论 -
JVM永久代和元空间的区别
绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储.原创 2021-03-13 17:58:08 · 348 阅读 · 1 评论 -
JVM_03 运行时数据区1_本地方法栈_Native Method stack
3 本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用本地方法栈,也是线程私有的。允许被实现成固定或者是可动态拓展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么java虚拟机将会抛出一个OutOfMemoryError原创 2021-03-09 15:51:48 · 128 阅读 · 0 评论 -
JVM_04 本地方法接口
本地方法简单来讲,一个Native Method就是一个java滴啊用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的原创 2021-03-09 15:47:34 · 124 阅读 · 0 评论 -
JVM_03 运行时数据区1_Stack_方法返回地址_Return Address
方法返回地址(Return Address)存放调用该方法的PC寄存器的值。一个方法的结束,有两种方式:正常执行完成出现未处理的异常,非正常退出无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出时,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。本质上,方法的退出就是当前栈帧出栈的过程。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值也如调原创 2021-03-09 15:39:57 · 288 阅读 · 0 评论 -
JVM_03 运行时数据区1_Stack_动态链接机制_Dynamic Linking
动态链接(Dynamic Linking)每一个栈帧内部都包含一个指向运行时常量池或该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如invokedynamic指令在Java源文件被编译成字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Refenrence)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。原创 2021-03-09 14:31:01 · 213 阅读 · 0 评论 -
JVM_03 运行时数据区1_Stack_操作数栈_Operand Stack
操作数栈(Operand Stack)栈 :可以使用数组或者链表来实现每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以成为表达式栈操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)或出栈(pop)某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用他们后再把结果压入栈。(如字节码指令bipush操作)比如:执行复制、交换、求和等操作2.4.1 概述操作数栈,主要用于保存计算过程的中间结果,同时原创 2021-03-09 14:03:02 · 151 阅读 · 0 评论 -
JVM_03 运行时数据区1_Stack_局部变量表_Local Variables
2.虚拟机栈2.1概述2.1.1 背景由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。2.1.2 内存中的堆与栈栈是运行时的单位,而堆是存储的单位即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块栈空间存放 基本数据类型的局原创 2021-03-09 12:44:52 · 219 阅读 · 0 评论 -
JVM_03 运行时数据区1_pc
01 内存内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区)(图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区02 分区介绍java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则原创 2021-03-08 21:27:17 · 137 阅读 · 0 评论 -
深入理解双亲委派机制
文章目录1.什么是双亲委派机制2.类加载器3.类加载器的加载路径4.源码了解1.流程图2.过程5.双亲委派机制的作用1、保证安全性2、保证唯一性1.什么是双亲委派机制当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。2.类加载器BootstrapClassLoader(启动类加载器)c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由原创 2021-03-04 17:23:42 · 406 阅读 · 2 评论 -
JVM_08 执行引擎_1(Execution Engine)
文章目录执行引擎概述Java代码编译和执行过程机器码、指令、汇编语言机器码指令指令集汇编语言高级语言字节码C、C++源程序执行过程解释器现状执行引擎概述执行引擎是Java虚拟机的核心组成部分之一虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字原创 2021-02-04 14:26:36 · 296 阅读 · 1 评论 -
对象的内存分布
美团面试:jvm的对象头是如何存储的,对象头中有哪些信息对象头里面的东西:运行时元数据,类型指针:Hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。如果是数组的化还需要记录长度就比如下面的代码来看,内存分布情况:由于是static的main方法所有局部变量表没有this,如果是非静态方法的话第一个放this。其次:栈帧:局部变量表,操作数栈,动态链接,方法返回值地址,附加信息cut对应的是堆空间的实例化对象。然后实例化对象的空间如图所示,有对象头,实例数原创 2021-02-03 19:38:47 · 254 阅读 · 0 评论 -
JVM_02 类加载子系统
JVM架构图1.类加载子系统作用类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识;ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)1.1类加载器ClassLoader角色1.2加载通过一个类的全限定明获取原创 2021-02-03 12:57:59 · 171 阅读 · 0 评论 -
JVM执行流程
public class demo01{ public static void main(String args[] ){ int i = 500; int j = 100; int a = i/j; int b = 50; System.out.println(a + b); }}ipush 放到操作数栈istore 到本地变量表div 除getstatic #2->常量池中的#2找到函数符号引用转为直接引用invokevirtual最后肯定有一个原创 2021-02-03 12:07:52 · 239 阅读 · 1 评论 -
JVM_01 简介
1.JVM的位置2.一些JVMSUN ClassicExact VMHotSpot VM :HotSpot指热点代码探测技术BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一IBM J9Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品3.Android虚拟机 DVM原创 2021-02-03 11:24:24 · 183 阅读 · 0 评论 -
jvm内存结构
文章目录1.运行时数据区1. 程序计数器2.栈2.1 Native方法2.2 什么是栈2.3 栈中存储的是什么2.3 局部变量表2.4 设置栈的大小2.5 栈的执行原理2.6 Slot 复用2.7 操作数栈3.Java堆4.方法区(Method Area)1.运行时数据区运行时数据区Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。每个区域都有各自的作用。分析 JVM 内存结构,主要就是分析 JVM 运行时数据存储区域。JVM 的运行时数据区主要包括:堆、栈、原创 2021-01-27 17:33:01 · 132 阅读 · 0 评论 -
jvm思维导图
https://www.processon.com/view/link/5ff6bff11e08531de8231a57#map思维导图1.jvm发展史2.类加载子系统3.运行时数据区域及线程4.PC5.虚拟机栈6.本地方法接口7.本地方法栈8.堆9.方法区10.直接内存11.执行引擎12.String Table13.垃圾回收机制概述14.垃圾回收机制算法15.垃圾回收相关概念16.垃圾回收器...原创 2021-01-26 19:02:02 · 171 阅读 · 0 评论 -
jvm的整体结构
字节码->类装载子系统->JVM->引擎/接口欧类装载子系统:将字节码文件加载至大的Class文件.分为:加载,连接,初始化3部分执行引擎:java代码执行流程jvm的架构模型hotspot虚拟机是基于栈的虚拟机...原创 2021-01-24 22:30:27 · 200 阅读 · 0 评论 -
jvm之类的加载机制和加载器
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。1.类加载过程1.1加载加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础,JVM提原创 2021-01-18 12:40:22 · 140 阅读 · 1 评论