
JVM专题
Life journey
技术没有边界
展开
-
Volatile内存屏障&指令重排
Volatile内存屏障&指令重排前言内存屏障CPU缓存架构之伪共享指令重排as-if-serialhappens-beforeJIT指令重排序指令重排序的手段volatile重排序规则前言在上一篇笔记中提到了volatile关键字的作用,我们知道并发编程的三大理论是可见性、有序性和原子性,而volatile只能保证可见性和有序性,有序性是什么呢?有序性就是让程序能够有序的执行,volatile可以禁止指令重排,但是指令重排在应用中其实很常见的,比如简单的例子就是当cpu在执行一条指令的时候,执原创 2020-09-18 22:19:13 · 2459 阅读 · 3 评论 -
执行引擎、逃逸分析、JIT即时编译
执行引擎、逃逸分析、JIT即时编译执行引擎是什么?java的两种解释器即时编译字节码解释器模板解释器两种解释器执行流程JIT(即时编译)的三种运行模式java中两种即时编译器即时编译启动触发条件热点代码缓冲区即时编译是如何运行的?为什么说java是半解释半编译的语言逃逸分析标量替换锁消除栈上分配执行引擎是什么?执行引擎是JVM的一套子系统,当程序运行的时候,执行引擎就开始工作了;在 Java 虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade)。原创 2020-09-15 17:14:27 · 411 阅读 · 0 评论 -
String字符串
String字符串常量池class文件常量池运行时常量池String常量池字符数组的存储方式不同方式创建字符串在JVM中的存在形式字符串连接常量池java中的常量池在我的理解中有三种,分别是calss常量池,运行时常量池和string 常量池class文件常量池class文件中的常量池是在硬盘上的,通过javap -verbose xxx.class可以看到:Constant pool: #1 = Methodref #7.#28 // java/lang/原创 2020-08-30 22:26:55 · 183 阅读 · 0 评论 -
JVM的内存模型
JVM的内存模型JVM 内存模型方法区虚拟机栈虚拟机栈执行流程局部变量表操作数栈this指针程序计数器JVM堆各个区之间的关系总结JVM 内存模型我们这边所讲的JVM内存模型是指JAVA8的内存模型,JVM的内存模型包含了:堆区、方法区、虚拟机栈、本地方法栈、程序计数器,关于JVM的内存模型,各大博客网站都有非常详细的讲解,这边我主要根据自己的理解做一个简单记录,具体看下图:其中运行数据区是JVM最重要的一块区域,运行数据区中的方法区和堆区是线程共享的区域而虚拟机栈和程序计数器是线程私有的区域,原创 2020-08-30 22:14:20 · 587 阅读 · 0 评论 -
手动解析java字节码文件
手动解析java字节码文件前言字节码文件原貌手动解析字节码文件常量池解析解析字段属性方法解析结束语前言我们平时编写的java源文件,也就是.java文件在经过编译过后会成为jvm能识别的.class文件,也就是编译成了字节码文件,jvm的执行引擎目前有两种执行的方式,字节码解释执行和模板解释执行,我们的通常的字节码文件要通过jvm(c++)解释成计算机能识别的硬编码,也就是汇编;而模板解释器是直接不通过C++代码进行解释执行,而是通过模板解释器直接解释成计算机能识别的硬编码,而这些被模板解释器解释成的硬原创 2020-08-28 13:34:45 · 807 阅读 · 1 评论 -
JVM类加载器子系统与SPI
类加载器子系统与SPI类加载器启动类加载器扩展类加载器应用类加载器类加载器加载的类如何存储双亲委派打破双亲委派SPI机制类加载器JVM中有两种类型的加载器,一种是由C++编写,一种是由JAVA编写,除了启动类加载器(Bootstrap Class Loader)是由C++编写的以外,其他都是由JAVA编写的,由JAVA编写的加载器都继承与java.lang.ClassLoader,JVM还支持自定义加载器,对于自定义加载器的典型用法就是可以破坏JVM的双亲委派,为什么要破坏双亲委派,想要做到破坏双亲委派原创 2020-08-26 23:11:25 · 644 阅读 · 0 评论 -
JVM底层之类加载器
JVM底层之类加载器前言JVM中的Klass模型验证准备初始化前言这篇博客记录下JVM底层的类加载器,关于类加载器网络上有不少博客写到,我这边只是根据自己的理解记录下jvm类加载器的过程,可能不会太详细,只是用于自己平时偶尔翻翻回忆下自己的曾经所获所得。JVM中的Klass模型java中的每一个类在JVM中都是以Klass形式存在的,其中包含了元数据信息,包含属性信息、方法信息以及常量池。Klass的模型结构如下:最顶层的父类是MeaSpaceObj,然后元信息类Metadata是子类,而我们原创 2020-08-26 23:02:32 · 540 阅读 · 0 评论 -
JVM是如何得到数组长度的
JVM是如何得到数组长度的这篇笔记主要记录下我们在java中编写的数组,比如int arr[] ={1,2,3};,那么我们使用int len = arr.length;jvm底层是如何得到数组长度的;数组在jvm底层是动态 产生的,也就是说不是静态的,类似于我们得到一个对象的hashcode一样,如果你没有重写过hashcode方法,那么对象的hashcode默认就是对象的内存地址,所以hashcode也是动态产生的,我们的数组也是一样的,我们定义好数组过后,数组在运行时是可以动态生成、动态添加以及动原创 2020-08-25 13:21:14 · 744 阅读 · 1 评论