![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 71
jvm相关文章
躺平程序猿
这个作者很懒,什么都没留下…
展开
-
JVM角度看方法调用-MethodHandle篇
JVM角度看方法调用系列文章:1.JVM角度看方法调用-开篇2.JVM角度看方法调用-反射篇3.JVM角度看方法调用-MethodHandle篇4.JVM角度看方法调用-性能压测篇(码字…)5.JVM角度看方法调用-Lambda篇(码字…) 在我们平时开发中常用的方法调用有三种:直接调用、反射调用、MethodHandle调用,这一系列文章就围绕着三种调用方式进行原理剖析和性能分析,本文JDK的版本是1.8。在上篇文章中我们最后总结由于反射调用的种种缺陷严重影响性能,所以当我们热点代码需要用到反射调用时不原创 2022-06-05 20:53:24 · 943 阅读 · 1 评论 -
JVM角度看方法调用-反射篇
文章目录一、反射调用的原理1.1获取MethodAccessor1.2 native版本MethodAccessor的实现1.3 java版本的MethodAccessor的实现二、反射调用优2.1、为什么反射调用性能低2.2、反射调用性能测试和优化(一)、直接调用(二)、反射调用(三)、反射调用优化版本1(四)、反射调用优化版本2(五)、反射调用优化版本3(六)、MethodHandle的黑魔法(七)、java版本超多态虚方法无法内联问题(八)、总结JVM角度看方法调用系列文章:1.JVM角度看方法原创 2022-05-26 07:00:00 · 463 阅读 · 0 评论 -
JVM角度看方法调用-开篇
文章目录一、虚方法和非虚方法1.1、Interpreter下执行比较1.2、JIT下比较1.2.1、内联缓存1.2.2、去虚化和方法内联1)非虚方法内联2)完全去虚化内联3)”陷阱“导致去优化4)条件去虚化内联二、Interpreter、JIT、AOT 分析三、JVM中可以内联和不能内联的场景JVM角度看方法调用系列文章:1.JVM角度看方法调用-开篇2.JVM角度看方法调用-反射篇 (码字...)3.JVM角度看方法调用-MethodHandle篇(码字...)4.JVM角度看方法调用-原创 2022-05-18 17:18:34 · 493 阅读 · 0 评论 -
JVM的Reference机制
1.finalizer生产大于消费导致内存溢出测试User重写了finalize方法的类在创建User对象的同时会创建一个Finalizer对象并加入到Finalizer中以unfinalized为头节点的链表中,当触发GC时如果垃圾收集器判断User对象没有与GCRoot的强引用时则会将Finalizer放到Reference.pending属性上,由线程ReferenceHandler负责处理将Finalizer添加到Finalizer.queue中,然后由线程FinalizerThread负责处理,原创 2022-01-10 11:04:42 · 476 阅读 · 0 评论 -
JVM本地方法栈
Java虚拟机栈用于关联java方法的调用,而本地方法栈用于管理本地方法的调用本地方法栈也是线程私有的本地方法就是java中常见的native方法,使用C语言实现的它的具体做法是在本地方法栈中等级native方法,在执行引擎执行时加载本地方法库并不是所有虚拟机都支持native因为在jvm规范中没有明确要求在HotspotJVM中,直接将本地方法栈和虚拟机栈合二为一了。想要了解什么是本地方法以及如何实现本地方法的可以看JNI与本地方法...原创 2021-08-03 23:15:37 · 638 阅读 · 0 评论 -
虚拟机栈面试题
一、调整虚拟机栈的大小能保证栈不溢出嘛?为什么溢出前不进行垃圾回收?答:不能保证,如果代码本身就有问题,一直无限进行方法调用,增加栈的大小只能推迟栈的溢出并不能避免。至于为什么不进行垃圾回收,由于栈不像堆中的对象一样引用关系复杂,栈桢中的垃圾无非是指执行完毕的方法栈桢,栈桢在出栈后即没有存在意义了直接销毁掉即可,所以栈中是不存在GC的。二、局部变量表中的数据是线程安全的嘛?或方法中定义的局部变量是否线程安全?答:这个不一定,要看这个局部变量有没有发生逃逸如果发生逃逸则不一定线程安全,如果未发生逃逸则原创 2021-08-03 23:14:10 · 76 阅读 · 0 评论 -
java虚拟机栈(亦篇足以,吴懈可击)
文章目录前言※局部变量表1.局部变量表概况2. 变量槽Slot3.局部变量和成员变量变量的分类※操作数栈1.操作数栈概述2.栈顶缓存技术先看n-TOS caching再看n-state TOS caching3.i++和++i问题※动态链接※方法返回地址三、方法的调用1.早起绑定和晚期绑定⭕️早期绑定⭕️晚期绑定2.虚方法和非虚方法⭕️非虚方法&虚方法定义⭕️方法调用字节码指令3.虚方法表⭕️为什么要有虚方法表⭕️虚方法表举例前言**[语雀地址:https://www.yuque.com..原创 2021-08-03 01:54:03 · 697 阅读 · 0 评论 -
JVM操作数栈之栈顶缓存(看不懂捶我)
前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/mggrlr基于栈式的架构的虚拟机所使用的零地址指令更加紧凑,单完成一项操作的时候必然需要使用更多的入栈和出栈指令,虚拟机栈也是存在于内存中,这就意味着将需要更多的指令分派次数和内存读/写次数,频繁的执行内存读/写操作必然会影响执行速度,为了解决这一问题HotSpot JVM的设计者们提出了栈顶缓存(Top-of-Stack-Caching)技术,将栈顶元素(或栈顶周边)元素缓存到物理CUP的原创 2021-08-01 03:30:58 · 1690 阅读 · 2 评论 -
(翻译)JVM——Java物理内存模型(JMM)及运行时内存模型
转载转载 2021-07-23 11:36:07 · 104 阅读 · 0 评论 -
程序计数器
程序计数器是jvm运行时数据区里最小的一块内存区域,几乎可以忽略不计,也是运行速度最快的一块区域程序计数器是在jvm规范中唯一一块不会出现OutOfMemoryError的区域程序计数器用来记录下一条要执行指令的地址,如果当前方法时native方法则程序计数器记录为null。由执行引擎修改程序计数器每个线程一个问:为什么程序计数器线程独立,每个线程都有一个?答:java是支持多线程的语言,程序计数器存在的很重要的一个原因是当线程上下文切换时记录当前线程将要执行的指令地址,防止线程切换回来时不.原创 2021-07-22 00:17:30 · 217 阅读 · 0 评论 -
java的SPI机制(jdk1.8)
SPI全名Service Provider Interface(服务提供者接口),SPI的主要目的是实现服务的热插拔效果,主要应对的场景是设计者提供一个接口,这个接口的具体实现由不同厂商提供,设计者只要引入厂商提供的实现jar包就可以自动装配,无需改动代码。例如:JDBC的驱动加载。SPI机制满足:不需要改动源码就可以实现扩展,解耦。实现扩展对原来的代码几乎没有侵入性。只需要添加配置就可以实现扩展,符合开闭原则。其实很多知名框架的自动装配都是借鉴了JDK的SPI机制如SpringBoot的star原创 2021-07-19 01:27:18 · 490 阅读 · 2 评论 -
类加载器一篇足以
文章目录前言一、类加载器相关概念1.Classloader的作用2.类加载的分类3.类加载器的必要性4.命名空间①.何为类的唯一性②.命名空间③.有关命名空间的例子例子1:不同类加载器加载的同一个class文件会产生两个Class对象例子2:打破双亲委派的情况下,MyClassloader可以加载系统类加载器已经加载过的类例子3:即便打破双亲委派机制,同一个类加载器也不能加载同一个类两次5.类加载机制的基本特征二、类加载器分类(java8)1.引导类加载器2.扩展类加载器3.系统类加载器4.数组的类加载..原创 2021-07-19 01:22:14 · 478 阅读 · 3 评论 -
java类加载子系统之类的卸载
文章目录前言一、描述二、图例三、方法区的垃圾回收前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd一、描述当Sample类被加载、链接和初始化后,他的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,堆上的Class对象就会被回收结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。..原创 2021-07-12 23:15:19 · 133 阅读 · 0 评论 -
jvm类加载子系统之类的初始化
文章目录前言一、具体描述二、的线程安全问题主动使用前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd一、具体描述类的初始化是类装载的最后一个阶段。如果前面的步骤都没有问题说明类可以被顺利装载到系统中,此时jvm才会执行类中的字节码(即到了初始化阶段才真正开始执行类中定义的java程序代码)。初始化阶段就是执行类初始化方法()的过程此方法不需要程序员定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码..原创 2021-07-11 22:55:59 · 221 阅读 · 1 评论 -
java的常量池
文章目录前言为甚要有常量池字节码中的常量池什么是符号引用运行时常量池什么是直接引用字符串常量池字符串常量池为什么要移动到堆中前言java中有字节码中的常量池、运行时常量池、字符串常量池三张常量池,语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd为甚要有常量池public class Demo1 { public static void main(String[] args) { System.ou..原创 2021-07-10 02:12:29 · 178 阅读 · 0 评论 -
jvm类加载子系统之链接阶段
文章目录前言准备(Prepare)解析(Resolve)前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd## 验证(Verify)**目的**:验证的目的是保证.class文件的字节流中信息符合当前虚拟机的要求,保证加载类的正起行,不会危害虚拟机的自身安全。验证大体分为四步格式检查、语义检查、字节码验证、符号引用验证,**验证阶段并不是单独存在的模块,验证阶段穿插在加载和解析阶段之中完成。**![在这里插入图片描..原创 2021-07-10 02:08:09 · 207 阅读 · 0 评论 -
类加载时JVM在搞什么?JVM源码分析+OOP-KLASS模型分析
OOP-Klass模型在撸源码之前首先科普下JVM的OOP-Klass模型:JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass,其中oop用来表示堆中的java对象实例,储存着对象实例的非静态成员变量属性,不包含任何方法;Klass用来表示java类的元数据,包含了java类中声明的方法存在于方法区;oop有klass的引用,如此多个oop实例就不用都保存一份相同的方法信息了。Klass分类OOP分类类加原创 2021-07-04 23:51:48 · 703 阅读 · 2 评论 -
JNI动态注册、静态注册实例及其实现原理分析
想要彻底学好JVM需要一定C语言基础,要理解头文件、指针、结构体、结构体指针、函数指针、类型别名等概念,本文尽量通俗易懂的介绍JNI一、什么是JNIJNI全名Java Native Interface中文名java本地开发接口。通过JNI可以让java代码调用C或C++等底层语言,也可以用C或C++调用java语言,是java与其他语言交互的协议和桥梁,可以保证java代码的可移植性。二、为什么要用JNI当你无法用纯Java来实现需求的时候,就需要使用JNI来用底层语言编写的本地方法来满足这些该需求原创 2021-06-24 15:02:02 · 1105 阅读 · 0 评论 -
JVM体系结构篇之JVM的指令集架构模型
常见的指令集架构有两种一种是基于寄存器的指令集架构,一种是基于栈的指令集架构。JVM采用的是后者。通过一段代码来分别介绍一下基于栈的指令集合基于寄存器的指令集的区别public static void method(){ int a=1; int b=2; int c=a+b; return;}基于栈的指令集架构执行的指令不算方法返回return一共8行代码,每个指令都是相对于栈顶栈帧和栈顶栈帧操作数栈的操作,无需关心操作数(进行加减乘除的变量,上图中的1、2)原创 2021-05-25 17:22:12 · 227 阅读 · 0 评论 -
JVM体系结构篇之java代码执行流程
首先Java源码经过前端编译器编译生成.class文件然后经过类加载器加载、字节码校验器校验进入JVM运行时数据区,当有方法被调用时,程序计数器中的字节码指令会被执行引擎的翻译器转换为机器指令执行;当出现热点代码时会被执行引擎的JIT及时编译器预先编译为机器指令并缓存到方法区,待到热点代码被调用时直接执行缓存中的机器指令。...原创 2021-05-25 17:16:27 · 197 阅读 · 0 评论 -
JVM体系结构篇之JVM的整体结构
上图为JVM在服务器上的整体结构图,从上到下简单介绍一下。.class:由.java(也可是其他文件)文件通过编译器编译得到字节码文件。类加载器子系统:将磁盘上的字节码文件转换为instanceKlass 保存在运行时数据区(方法区)中,一个字节码文件通过类加载子系统添加到运行时数据区需要经过加载、连接、初始化三个步骤。运行时数据区:JVM在执行java程序的过程中所管理的内存(会根据其职责或分为多个区域)。执行引擎:将程序计数器中记录的字节码指令转换为机器语言。与程序计数器的双向箭头是由于,执行.原创 2021-05-24 19:24:34 · 294 阅读 · 1 评论 -
JVM面试问答一(为什么废弃永久代采用元空间?)
问:为什么废弃永久代采用元空间?答:在看深入了解JVM这本书的时候看到方法区那一块,作者就备注了一个Oracle官网的连接,里面有官方的回答,是说因为Oracle收购了jrockit虚拟机,要将它和HotSpot做整合,而jrockit是没有永久代的而且jrockit用户也没有配置永久代大小的习惯所以将废弃永久代与jrockit保持一致采用元空间实现方法区。但是感觉解释的有点牵强没有在技术层面细致解释一下原因,这个问题网上也有各种各样的声音,我的理解是因为两大虚拟机要做统一永久代和元空间势必要废弃一个,而原创 2021-04-11 15:48:24 · 233 阅读 · 1 评论 -
JVM垃圾收集器与内存分配策略一(JVM堆、栈、方法区内存溢出案例)
java与C++直接有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙内的人想出来,作为一个java工程师,接下来将带大家一探墙内秘密。这篇文章是JVM垃圾收集器与内存分配策略模块学习的第一篇文章,主要是作为真正学习前的铺垫,主要会介绍一下JVM运行时数据区以及各个区域在什么情景下回出现内存溢出,下文会通过代码实战模拟JVM的各个区域的内存溢出情景,并加以分析。JVM运行时数据区...原创 2021-03-28 18:15:37 · 191 阅读 · 0 评论 -
为什么不建议调用sun.*包中的方法,Reflection.getCallerClass()报错
添加链接描述转载 2020-02-03 21:24:42 · 1631 阅读 · 0 评论