JVM学习
文章平均质量分 92
jvm学习
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 下
简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 下原创 2023-09-13 15:35:43 · 470 阅读 · 0 评论 -
简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 上
简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 上原创 2023-09-13 10:12:38 · 652 阅读 · 1 评论 -
独特视角解读JVM内存模型
每一个类被加载的时候,java 虚拟机都监视这个类,看它到底是被启动类加载器加载还是用户定义的类加载器加载。当被装载的类引用了另外一个类的时候,虚拟机就会使用装载第一个类的类装载器装载被引用的类。由于java虚拟机采取这种方式进行类的加载,所以被装载的类默认情况下只能看到同一个类加载器装载的类。通过这种方法,java体系结构允许在一个java应用程序中建立多个命名空间。运行时的java程序中每一个类加载器都有自己的命名空间,处于不同命名空间中的类不能互相访问。我们这里只探讨类加载对于JAVA沙箱安全性保障起原创 2023-03-22 15:21:31 · 318 阅读 · 0 评论 -
java多态理解和底层实现原理剖析
这里的关键点在于实例变量和实例方法在数组中的占据的索引位置是不变的 ,例如: 子类继承了某个父类,子类自己的方法表中也是父类方法优先,接着是自己的方法,这样可以确保父类方法在子类和父类方法表中的索引都是一致的。超类的方法出现在来自子类的方法前,并且方法表中方法指针排序顺序和方法在class文件中出现顺序相同,当然,如果存在子类覆盖父类方法的情况,那么子类覆盖的方法会出现在超类中该方法第一次出现的位置。相反,当虚拟机调用一个实例方法时,它会基于对象的实际类型(运行时确定)来选择调用的方法。原创 2023-02-26 21:48:08 · 982 阅读 · 0 评论 -
Groovy实现热部署
Groovy是构建在JVM上的一个轻量级却强大的动态语言, 它结合了Python、Ruby和Smalltalk的许多强大的特性.Groovy就是用Java写的 , Groovy语法与Java语法类似, Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码, 相对于Java, 它在编写代码的灵活性上有非常明显的提升,Groovy 可以使用其他 Java 语言编写的库.动态类实现从文件生成,改动后能立即检测到。动态类实现从数据库中生成,改动后能立即检测到。原创 2023-01-26 20:45:25 · 1320 阅读 · 0 评论 -
Java内存模型和线程安全
如果出现两条以上的线程争用同一个锁的情况,那轻量级锁就不再有效,必须要膨胀为重量级锁,锁标志的状态值变为“10”,此时Mark Word中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也必须进入阻塞状态。轻量级锁可以在没有线程竞争的情况下,避免创建对应的监视器对象,但是如果锁总是被一个线程获取,那么就没有必要在获取锁前打上标记,而释放锁前撤销标记了,可以只打一次标记,如果下次还是这个同一个线程来获取锁,那么就没必要重复进行打标记和释放标记了。原创 2023-01-19 12:40:45 · 751 阅读 · 0 评论 -
从C和C++内存管理来谈谈JVM的垃圾回收算法设计-下
在决定进行回收的时候,g1会对region按照回收价值和成本排序,根据用户期望的停顿时间来指定回收计划,可以自由选择任意多个region组成回收集,然后把决定回收的那一部分region的存活对象复制到空的.region中,再清理掉整个旧的region的全部空间。G1将Region作为回收的最小单元,每次回收的内存空间都是Region的整数倍大小,G1通过跟踪各个Region里面的垃圾收集价值,在后台维护一个优先级列表,每次根据用户设定的允许收集停顿时间,优先处理那些回收价值最大的Region。原创 2023-01-15 14:56:26 · 513 阅读 · 0 评论 -
从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上
事实是这样的,_edata + 30K 只是完成虚拟地址的分配,A 这块内存现在还是没有物理页与之对应的,等到进程第一次读写 A 这块内存的时候,发生缺页中断,这个时候,内核才分配 A 这块内存对应的物理页。鉴于此,malloc采用的是内存池的实现方式,malloc内存池实现方式更类似于STL分配器和memcached的内存池,先申请一大块内存,然后将内存分成不同大小的内存块,然后用户申请内存时,直接从内存池中选择一块相近的内存块即可。但这是理论值,因为实际中,还会包含代码区,全局变量区和栈区。原创 2023-01-13 15:57:35 · 711 阅读 · 0 评论 -
JAVA实现代码热更新
JAVA实现代码热更新原创 2023-01-10 15:29:17 · 4044 阅读 · 1 评论 -
JVM中如何存储对象和类
本文带大家了解了Java的类与对象在JVM中的存在形式,JVM将其一分为二,分为Oop-Klass,分别存储对象示例信息及类的元信息,在整个证明过程中,我们使用了HSDB这个强大的工具,对这一结构进行窥探及证明。当然,Oop-Klass模型内部是一个庞大的体系,本文只是抓取了日常使用频次比较高的类以及比较有特点的一些类进行验证,感兴趣的同学可以在线下根据这套方法,自己去验证其他的一些类型的表示形式。转载 2022-11-20 20:43:04 · 348 阅读 · 0 评论 -
站在操作系统层面看JVM
所以到了某个具体的平台,被特定平台的JVM Runtime解释成本平台的machine code,得到可执行代码,存储到Native Code区,machine code运行起来之后就会用到Native Stack和Native Heap,这种把源代码先翻译成中间代码(即ByteCode)再由解释器解释成机器码供运行的模式,就实现了“Write Once,Run Anywhere”。JVM 的角度看,JVM 内存之外的部分叫作本地内存,C 程序代码在运行过程中用到的内存就是本地内存中分配的。原创 2022-11-20 12:08:31 · 437 阅读 · 0 评论 -
ServiceLoader和DriverManager的前世今生
我们先来看看JDBC获取数据库连接有哪几种做法: 和第一种方式没有区别,这里不再多说 下面就是把Driver注册到了DriverManager进行管理,但是也不推荐这种方式 下面这种方式相对来说就舒服很多,但是其实还可以更简单 下面一行代码就够了相信大家看着我一步步简化到最后,已经蒙了,为什么可以这样写,别急,下面我们就来看看DriverManager到底是怎么实现的因为DriverManager实现主要依靠了ServiceLoader来完成,因此这里先来看看Servic原创 2022-06-05 16:55:44 · 369 阅读 · 0 评论 -
三种类加载姿势
常见的三种类加载方式如下:那么下面抛出问题: 这三种加载方式有什么不同?要回答上面这个问题,我们先来看看一个java.class文件从磁盘被加载到内存要经历那些步骤吧。类加载详细参考此文还有一点: 前两种方式都是静态加载,而最后一种方式是动态加载new关键字和newInstance()方法的区别:Class.forName与ClassLoader.loadClass区别Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)。上面也已经讲过一遍了。实际上原创 2022-06-05 15:19:15 · 610 阅读 · 0 评论 -
类加载器盲区整理
ServiceLoader原理深入理解Java类加载器(ClassLoader)原创 2022-06-05 12:37:29 · 159 阅读 · 0 评论 -
类加载器如何实现类隔离
类加载器如何实现类隔离什么是类隔离技术如何实现类隔离实操1 重写 findClass重写 loadClass总结更多类加载器知识点,可以看一下我之前写过关于类加载器的文章:JVM第六卷—类加载机制JVM第八卷—类加载与执行子系统的案例与实战什么是类隔离技术只要你 Java 代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件的 jar 包,编译的时候一切正常,一运行就报错:java.lang.NoSuchMethodError,然后就哼哧哼哧的开始找解决方法,最后在几百个依赖包里面找的原创 2022-03-14 20:06:46 · 949 阅读 · 0 评论 -
JVM第八卷---类加载与执行子系统的案例与实战
JVM第八卷---类加载与执行子系统的案例与实战类加载器服务器困境Tomcat: 正统的类加载架构OSGi:灵活的类加载器结构字节码生成技术与动态代理的实现实战:自己动手实现远程执行功能目标思路实现类加载器JVM第六卷—类加载机制中已经讲述了类加载器的相关知识,这里简单回顾一些重点Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述类的二进制字节流",这个动作放到Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需的类,实现这个动作的代码被称为"类加载器"比较两个类是原创 2022-02-26 21:43:00 · 569 阅读 · 0 评论 -
JVM第七卷---虚拟机字节码执行引擎
JVM第六卷---类加载机制概述运行时栈帧结构局部变量表操作数栈动态链接方法返回地址方法调用解析分派静态分派动态分派导读:代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步概述物理机的执行引擎是直接建立在处理器,缓存,指令集和操作系统层面的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件限制定制指令集与执行引擎结构体系,能够执行哪些不被硬件直接支持的指令集格式。在《JAVA虚拟机规范》中规定了Java虚拟机字节码执行引擎的概念模型,这个概念原创 2022-02-26 17:21:14 · 815 阅读 · 0 评论 -
JVM第六卷---类加载机制
JVM第六卷---类加载机制类加载机制加载链接验证准备解析< cinit >()V 方法发生的时机练习类加载机制Java虚拟机把描述类结构的数据从Class文件中加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制在Java语言里面,类型的加载,连接和初始化过程都是在程序运行期间完成的,这也为java语言动态扩展提供了可能,例如:在编写一个面向接口的应用时(参考mybaits的mapper),可以等待运行时再指定其实原创 2022-02-24 20:04:34 · 506 阅读 · 0 评论 -
JVM第五卷---编译期处理
JVM第五卷编译期处理默认构造器自动拆装箱编译期处理所谓的 语法糖 ,其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利(给糖吃嘛)注意,以下代码的分析,借助了 javap 工具,idea 的反编译功能,idea 插件 jclasslib 等工具。另外,编译器转换的结果直接就是 class 字节码,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并原创 2022-02-23 20:24:08 · 512 阅读 · 0 评论 -
JVM第四卷--类加载与字节码技术
JVM第四卷--类加载与字节码技术类加载与字节码技术类文件结构一个简单的 HelloWorld.javaClass类文件结构魔数版本常量池访问标识类索引,父类索引与接口所有集合字段表集合类加载与字节码技术类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化类文件结构一个简单的 HelloWorld.java// HelloWorld 示例 public class HelloWorld { public static void main(String[] ar原创 2022-02-23 18:06:53 · 631 阅读 · 0 评论 -
JVM第二卷
JVM第二卷垃圾回收1. 如何判断对象可以回收引用计数法可达性分析算法垃圾回收如何判断对象可以回收垃圾回收算法分代垃圾回收垃圾回收器垃圾回收调优1. 如何判断对象可以回收当一个对象没有人再引用他的时候,他就可以被回收了垃圾回收算法有如下几种:引用计数法当一个对象被别人引用的时候,会在当前引用计数的基础上进行一次累加操作,表示有一个人引用他了引用计数法有一个大BUG,就是当存在循环引用现象的时候,就会导致双方引用计数始终无法归零,内存没办法被释放可达性分析算法原创 2022-02-16 11:45:59 · 1158 阅读 · 0 评论 -
JVM资料整理
JVM困惑问题记录OopMap,安全点,安全区域的理解OopMap,安全点,安全区域的理解目前主流虚拟机使用的都是准确式垃圾收集,即Exact VM oopMapoop (ordinary object pointer) 普通对象指针,oopmap就是存放这些指针的map,OopMap 用于枚举 GC Roots,记录栈中引用数据类型的位置。迄今为止,所有收集器在根节点枚举这一步骤都是必须暂停用户线程的,收集线程会对栈上的内存进行扫描,看看哪些位置存储了Reference类型。如果发现某个位原创 2022-02-01 23:12:06 · 202 阅读 · 0 评论 -
JVM第一卷
JVM引言定义:学习路线内存结构1. 程序计数器定义作用2.虚拟机栈定义问题辨析引言什么是 JVM ?学习路线定义:Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)好处: 一次编写,到处运行 自动内存管理,垃圾回收功能 数组下标越界检查 多态比较:jvm jre jdk学习路线内存结构程序计数器虚拟机栈本地方法栈堆5. 方法区1. 程序计数器定义Program Count原创 2022-01-21 15:26:58 · 1360 阅读 · 0 评论 -
JVM学习---类加载子系统
类加载子系统内存结构概述简图详细图类加载器子系统类加载器子系统作用类加载器ClassLoader角色类加载过程概述加载阶段链接阶段验证(Verify)准备(Prepare)解析(Resolve)符号引用初始化阶段类的初始化时机clinit()1,2,3说明4说明5说明6说明类加载器的分类概述ExtClassLoaderAppClassLoader虚拟机自带的加载器启动类加载器扩展类加载器系统类加载器用户自定义类加载器什么时候需要自定义类加载器?如何自定义类加载器?关于ClassLoader获取ClassLo原创 2021-10-06 13:26:43 · 227 阅读 · 0 评论 -
JVM学习---JVM的生命周期
JVM的生命周期虚拟机的启动虚拟机的执行虚拟机的退出虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。虚拟机的执行 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序 程序开始执行时他才运行,程序结束时他就停止 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程虚拟机的退出有如下的几种情况: 程序正常执原创 2021-10-05 18:55:35 · 179 阅读 · 0 评论 -
JVM学习—整体介绍
JVMJava-跨平台的语言JVM-跨语言的平台多语言混合编程虚拟机虚拟机的概念Java虚拟机作用:特点:JVM的位置JVM的整体结构Java代码执行流程JVM的架构模型Java-跨平台的语言JVM-跨语言的平台 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。 Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地原创 2021-10-05 13:29:24 · 167 阅读 · 0 评论