![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 91
清风拂来水波不兴
远在天涯
展开
-
JVM运行期编译与优化
概述 在java中目前使用的虚拟机还是Hotspot虚拟机,该名称的由来就是它内部采用的热点代码检测技术。我们首先需要知道class文件时如何被执行的,大部分的语言都是单纯的分为编译和解释两种方式。编译器:首先将源代码编译为所有电脑都能执行的目标代码(机器码),然后再执行该编译后的代码,这样通过提前先编译好,等到执行的时候就会比较快,好处就是快,缺点是编译需要占用用户的一些时间。 解释器:一行一行的进行解释和运行,这种方式好处就是节约了编译时的事件,且节省了存放目标代码的空间,缺点就...原创 2021-12-20 14:59:41 · 599 阅读 · 0 评论 -
java语法糖
概述几乎所有的语言都涉及到语法糖,语法糖时啥呢?语法糖其实就是在开发中方便程序员用的一些语法,该语法和正常语法的区别就在于:语法糖在底层其时是不能够被一次性直接实现的,它们需要依靠一些技术或普通语法实现。当我们编译.java文件为.class文件的时候,底层编译器解析到语法糖时就会进行解语法糖操作,还原为普通语法。 这些语法虽然不会提供实质性的功能改进,但是能提高我们开发的效率,提供严谨性,但一门语言的语法糖不是越多越好,大量的添加语法糖会让开发者产生依赖,无法知道程序...原创 2021-12-12 19:49:03 · 2786 阅读 · 0 评论 -
方法调用机制、多态的原理
方法调用一起方法在Class文件中存储的只是符号引用,而并不是直接引用。在类的加载的解析阶段只会让其中的一部分符号引用转为直接引用,为什么会出现这种差异呢?原因是在程序运行之前,有很多种因素使得我们不能确定哪些方法应该被正确调用。在运行时就能确定的且这个方法在运行期不可变的就可以立即转为直接引用。首先看如下一个类public class TestClass extends Object { public TestClass() {}//构造方法 public s...原创 2021-12-08 15:44:02 · 449 阅读 · 0 评论 -
打破双亲委派之SPI、线程上下文类加载器、ServiceLoader
概述我们通过JDBC的实现机制来讲解// 加载Class到AppClassLoader(应用类加载器),然后注册驱动类// Class.forName("com.mysql.jdbc.Driver").newInstance();String url = "jdbc:mysql://localhost:3306/web"; // 通过java库获取数据库连接Connection conn = java.sql.DriverManager.getConnection(url, ...原创 2021-12-07 00:10:51 · 1122 阅读 · 1 评论 -
类加载器和双亲委派机制详解
通过一个类的全限定名来获取该类的二进制字节流就是类加载器(Class Loader)要干的事。前一篇我们讲解了类加载机制,这一篇和类加载机制中的加载阶段相呼应,这个动作放在了虚拟机外部去实现的,所以我们能够自己实现自定义的类加载器。唯一性 在java中你用某个类加载器加载了一个类,那么就必须保证这个类加载器和这个类组成一个唯一的组合。每个类加载器都有一个独立的类名称空间,所以两个同名的类或者是tongyige是不同的类加载器加载出来的就不算相同,所以判断一个...原创 2021-12-07 00:11:48 · 501 阅读 · 0 评论 -
jvm深入理解类加载机制
概述上一篇我们讲解了java文件到class文件的解析过程,但class文件中描述的信息都是死的,像一些类呀,在class文件里保存的只是一个全限定名,我们需要把这些数据加载到虚拟机里面去运行和使用,这一篇将讲解calss文件加载到虚拟机的过程,在内存中真正使用到各种信息。java虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这个过程就被叫做虚拟机的类加载机制。 类加...原创 2021-12-03 21:18:16 · 363 阅读 · 0 评论 -
JVM .class 类文件结构
概述大家都知道java语言的一次编写到处运行的特点,其实这一特点归因于.java文件编译后的.calss文件。java虚拟机不与包括java语言在内的任何语言绑定,它只与class文件这种特定的二进制文件格式所关联,Class文件包含了java虚拟机的指令和符号表等等信息。理解了class文件格式, 对于我们学习基于JVM的其他语言会有很大帮助。Class文件的结构u1,u2,u4……分别代表一个字节,两个字节,四个字节的无符号数。根据JVM规范,类文件结构如下:类型 名称 .原创 2021-11-28 15:29:12 · 324 阅读 · 0 评论 -
JVM垃圾收集器详解 CMS、G1、Shenandoah、ZGC
上一篇我们讲解了一些垃圾回收的理论和一些基础的算法和思想,这一篇主要是jvm从古至今垃圾回收器的实现。讲具体的实现之前,先说说几个和这些垃圾回收器息息相关的一些知识点,可以有一个更好的理解...原创 2021-11-24 18:44:15 · 1121 阅读 · 0 评论 -
jvm根节点枚举、安全点、安全区域、记忆集、卡表、写屏障、并发的可达性分析
讲具体的实现之前,先说说几个和这些垃圾回收器息息相关的一些知识点,可以有一个更好的理解1.根节点枚举也就是可达性分析算法从GC Roots集合中找引用链的过程,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,虽然目标已经明确,但要逐个检查这里面的引用,那么必然会消耗很多时间。 迄今为止,所以垃圾回收器在根节点枚举这一步骤都是需要暂停用户线程的,也就是STW,根节点枚举必须在一个保证一致性的快照中进行,也...原创 2021-11-20 13:10:47 · 891 阅读 · 0 评论 -
深入理解jvm虚拟机 JVM垃圾回收详解、四种引用、分代回收机制、回收算法、分配担保机制
概述垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。垃圾收集需要考虑完成的三件事情:哪些内存需要回收? 什么时候回收? 如何回收我们将带着这三个依次分析。哪些内存需要回收?什么时候回收?对应前两个疑问,哪些对象已经死去了?哪些对象我们已经用不到了?哪些对象可以被回收了?这时候我们就需要一些算法去判断java堆内存中哪些对象可以被回收,把原创 2021-11-19 12:49:43 · 580 阅读 · 0 评论 -
深入理解java虚拟机之直接内存、直接内存的溢出和泄漏问题
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,但这部分被频繁的使用到,也会OOM异常。他不受垃圾回收的影响。它的内存释放与回收实际是利用了Unsafe对象的unsafe.allocateMemory() \ unsafe.freeMemory(),必须手动释放学过Nio的朋友可能知道一种基于通道和缓冲区的I/O方式,他是用native函数库直接分配堆外内存,避免了java堆和native堆中来回复制数据。直接内存的分配不受java堆大小的限制。 有兴趣的可以看看Netty导学之原创 2021-11-16 09:44:14 · 690 阅读 · 0 评论 -
IO操作之零拷贝技术(图解)
首先看下面一段代码:File file = new File("hello.txt");RandomAccessFile ra=new RandomAccessFile(file,"r");byte[] buff=new byte[(int) file.length()]; //读取本地文件读到一个byte数组ra.read(buff);Socket socket=...;//向Socket写该数据socket.getOutputStream().write(buff);.原创 2021-11-06 15:47:55 · 245 阅读 · 0 评论 -
深入理解java虚拟机,运行时常量池和StringTable 经典面试题
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。静态常量池就是你编译生成的.class文件里面存放的数据,静态常量池主要存放:字面量和符号引用,所谓字面量就是一些文本字符串,被声明为final类型的final常量值等。而符号引用主要是编译原理方面相关的概念。主要包括下面几类常量:类和接口的名字(全限定名) 字段的名称和描述符 方法的名称和描述符 方法类型和方法句柄虚拟机指令根据这种表找到要执行的类名,方法名,参数类型等信息。...原创 2021-11-05 17:24:15 · 374 阅读 · 0 评论 -
深入浅出java虚拟机,JVM学习初篇,java内存区域以及内存溢出问题
java程序在运行时会它会把它所管理的内存划分为多个区域,各有各的用途。下面我会一一解释这些比较重要的区域。一,程序计数器定义:(Program Counter Register)是一块较小的区域,它是线程私有的(即每个线程都有一个独立的程序计数器,各线程之间的程序计数器互不影响,独立存储)。PC通过寄存器实现,因此读取比较快。所谓计数就是通过这个计数器的值来记录下一条要执行的字节码指令的地址。如一个简单的java程序反编译后的结果为上图,每一行就是一个jvm指令,前..原创 2021-11-04 17:01:36 · 345 阅读 · 0 评论 -
深入浅出java虚拟机,JVM学习初篇,认识java虚拟机,jvm学习路线
前言道阻且长,行则将至。我希望用我的文章能够能让各位学习java的伙伴有所收获,也希望我们能一起坚持下去,朝着各自的理想。一,为什么要学习jvm在学习java的路线上,jvm的知识点实际涉及到的并不多,但我们为什么还要学习呢?相信有很多初学者也很排斥,但是我觉得jvm是必修的课程,在这jvm的学习道路上,我受益良多。学习jvm的好处:1. 面试中的常客jvm,特别是想进大厂的小伙伴,据我观察,大厂java岗位,岗位要求上都有熟悉jvm这一条件。2. 深入理解java这门语言。原创 2021-11-04 14:04:10 · 470 阅读 · 0 评论 -
深入浅出java虚拟机,JVM学习初篇,认识JDK
JDK技术体系相信大家都有一段被JDK支配的恐惧,java学习之初配置环境变量的时候肯定特别懵逼,为什么要这所谓的JDK呢?JDK是什么呢?我们可以把java程序设计语言、java虚拟机、java类库中三部分称为JDK(Java Development Kit)。JDK用于支持java程序开发的最小环境。SUN公司除了提供JDK,还提供了一种JRE(JavaRuntimeEnvironment)工具,它是Java运行环境,是提供给普通用户使用的。为了方便使用,SUN公司在其JDK工具中自带了一个原创 2021-11-04 13:19:52 · 187 阅读 · 0 评论