![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
盖大大
hello world
展开
-
关于Java虚拟机JVM字节码与类的加载篇中认识
一-Class文件结构二-字节码指令集与解析举例三-类的加载过程详解四-再谈类的加载器原创 2020-11-07 09:09:15 · 86 阅读 · 0 评论 -
关于Java虚拟机JVM内存与垃圾回收篇初认识
一-JVM与Java体系结构二-类加载子系统三-运行时数据区概述及线程四-程序计数器五-虚拟机栈六-本地方法接口七-本地方法栈八-堆九-方法区十-直接内存十一-执行引擎十二-StringTable十三-垃圾回收概述十四-垃圾回收相关算法十五-垃圾回收相关概念十六-垃圾回收器...原创 2020-08-19 13:31:18 · 154 阅读 · 1 评论 -
四-再谈类的加载器
4.1 概述类加载器是JVM执行类加载机制的前提ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息上的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于他是否可以运行,则由Execution原创 2020-12-14 21:48:55 · 111 阅读 · 0 评论 -
三-类的加载过程详解
3.1 概述Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载从class文件到加载到内存中的类,到类卸载出内存为止,整个生命周期从程序中类的使用过程看:大厂面试题:描述JVM加载Class文件的原理机制java类加载过程类加载的时机3.2 过程一:Loading(加载)阶段3.2.1 加载完成的操作所谓加载,就是讲Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型–类模板对象。所谓类模板对象原创 2020-11-30 20:43:34 · 517 阅读 · 0 评论 -
二-字节码指令集与解析举例
2.1 概述Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码Opcode),以及后面的零至多个代表此操作所需参数(操作数,Operands)而构成。由于Java虚拟机采用面对操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码Java虚拟机操作码的长度为一个字节(0~255)官方文档2.1.1执行模型如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当作最基本的执行模型来理解do{ 自动计算PC寄存器的值加1; 根原创 2020-11-14 14:59:54 · 555 阅读 · 0 评论 -
一-Class文件结构
1.1 概述Java规范BAT面试题类文件结构有几个部分?字节码都有哪些?Integer x = 5 ;int y = 5;比较x==y都经过了哪些步骤public class IntegerTest { public static void main(String[] args) { Integer i1 = 10; Integer i2 = 10; System.out.println(i1 == i2);//true原创 2020-11-08 18:59:18 · 451 阅读 · 2 评论 -
十七-垃圾回收器
17.1 GC分类与性能指标17.2 不同的垃圾回收器概述17.3 Serial回收器:串行回收17.4 ParNew回收器:并行回收17.5 Paraller回收器:吞吐量优先17.6 CMS回收器:低延迟17.7 G1回收器:区域化分代式17.8 垃圾回收器总结17.9 GC日志分析17.10 垃圾回收器的新发展...原创 2020-10-25 16:51:30 · 140 阅读 · 0 评论 -
十六-垃圾回收相关概念
16.1 System.gc()的理解默认情况下,通过System.gc()或Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时堆老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然而System.gc()调用附带一个免责声明,无法保证堆垃圾收集器的调用JVM实现者可以通过System.gc()调用来决定JVM的GC的行为。一般情况下,垃圾回收应该使自动进行的,无须手动触发,否则过于麻烦。public class SystemGCTest { pu原创 2020-10-18 14:34:52 · 119 阅读 · 3 评论 -
十五-垃圾回收相关算法
15.1 标记阶段:引用计数算法引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1.只要对象A的引用计数器的值为0,则表示对象A不可能再被使用,可进行回收优点:实现简单,便于辨识;判定效率高,没有延迟性缺点:需要单独的字段存储计数器,增加了存储空间的开销每次赋值都需要更新计数器,增加了时间开销无法处理循环引用的情况,这是致原创 2020-10-11 13:57:48 · 254 阅读 · 0 评论 -
十四-垃圾回收概述
14.1 什么是垃圾(Garbage)垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,可能导致内存溢出大厂面试题蚂蚁金服:知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和g1JVM GC算法都有哪些,目前JDK版本采用什么回收算法G1回收器下回收过程GC是什么,为什么会有GCGC的两种判定方法,CMS收集器和G1收集器的特点百度:GC原创 2020-10-09 17:10:40 · 163 阅读 · 0 评论 -
十三-String Table
13.1 String的基本特性String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小String在jdk8以前内部定义了final char[] value用于存储字符串数据,jdk9改为byte[]String:代表不可变的字符序列。不可变性public class StringTest1 { public static void test1() {原创 2020-10-04 19:41:26 · 184 阅读 · 0 评论 -
十二-执行引擎
12.1 执行引擎概述执行引擎是Java虚拟机核心组成部分之一。JVM主要任务是负责装载字节码到其内部,如果想要一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。执行引擎的工作过程从外观上来看,所有Java虚拟机的执行引擎输入、输出都是一致的。输入时字节码二进制流,处理过程时字节码解析执行的等效过程,输出的是执行结果。12.2 代码编译和执行过程大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集原创 2020-09-27 13:53:13 · 163 阅读 · 0 评论 -
十一-直接内存
11.1 直接内存(Direct Memory)概述不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范定义的内存区域直接内存是在Java堆外,直接向系统申请的内存区域来源于NIO(New IO/Non-Blocking IO),通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度优于Java堆,读写性能高。因此出于性能考虑,读写频繁的场合会考虑直接使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区直接分配本地内存空间in原创 2020-09-20 16:04:20 · 165 阅读 · 0 评论 -
十-对象的实例化内存布局与访问定位
10.1 对象的实例化对象实例化的过程加载类元信息为对象分配内存处理并发问题属性的默认初始化设置对象头的信息属性的显示初始化、代码块中初始化、构造器中初始化10.2 对象的内存布局小结10.3 对象的访问定位JVM十如何通过栈帧中的对象引用访问到其内部的对象实例的呢?对象访问的两种形式句柄访问直接指针(Hotspot采用)...原创 2020-09-20 14:23:08 · 63 阅读 · 0 评论 -
九-方法区
9.1 栈、堆、方法区的交互关系Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中9.2 方法区的理解所以,方法区看作使一块独立于Java堆的内存空间方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动时被创建,他实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,一个选择固定大小或可扩展方法区的大小决定了系统可以保存多少个类,如果.原创 2020-09-13 21:45:42 · 157 阅读 · 0 评论 -
八-堆
8.1 堆(Heap)的核心概念一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域Java堆区在JVM启动时就被创建,空间大小也就确定了。是JVM管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但在逻辑上被视为连续的所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)数据和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或数组在堆中的位置在方法结束后,堆中的对象不会马上被移原创 2020-09-06 21:08:54 · 193 阅读 · 0 评论 -
七-本地方法栈
Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用,是线程私有的。当某个线程调用一个本地方法时,他就进入一个全新的并且不受虚拟机限制的世界,和虚拟机拥有同样的权限本地方法可以通过本地方法接口来访问虚拟机内部的运行数据区可以直接使用本地处理器中的寄存器直接从本地内存的堆中分配任意数量的内存在Hotspot JVM中,将本地方法栈和虚拟机栈合二为一...原创 2020-09-05 10:00:32 · 95 阅读 · 0 评论 -
六-本地方法接口
一个Native Method就是一个Java调用非Java代码的接口,该方法是由非Java语言实现。有时Java应用需要与Java外面的环境交互,这是本地方法存在的主要原因。你可以想想Java需要与一些底层系统,如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解Java应用之外的繁琐的细节。...原创 2020-09-05 09:47:33 · 107 阅读 · 0 评论 -
五-虚拟机栈
5.1 概述栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序怎么运行,如何处理数据。堆解决的是数据存储问题,即数据怎么放。Java虚拟机栈(Java Virtual Machine Stack),Java栈。每个线程在创建时都会创建一个虚拟机栈,内部保存一个个的栈帧(Stack Frame),对应Java方法调用,生命周期和线程一致主管Java程序的运行,保存方法的局部变量(8种基本类型、对象的引用地址)、部分结果,并参与方法的调用和返回虚拟机中遇到的异常Java虚拟机允许J原创 2020-08-27 12:09:45 · 237 阅读 · 1 评论 -
四-程序计数器(PC寄存器)
4.1 PC Register介绍JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码,有执行引擎读取下一条指令。是一块很小的内存空间,运行速度最快的存储区域在JVM中,每个线程都有自己的程序计数器,是线程私有的,生命周期和线程的生命周期保持一致任何时间一个线程都只有一个方法在执行,也就是所有的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;如果在执行native方法,则是undefined是程序控制流原创 2020-08-22 16:15:11 · 899 阅读 · 0 评论 -
三-运行时数据区概述及线程
3.1 前言灰色的为单独线程私有的,红色的为多个线程共享的。每个线程:独立包括程序计数器、栈、本地栈线程间共享:堆、堆外内存(永久代或者元空间、代码缓存)3.2 线程线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行。在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射当一个Java线程准备号执行后,此时一个操作系统的本地线程也同时创建。Java线程执行结束后,本地线程也会回收操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成原创 2020-08-22 10:40:13 · 106 阅读 · 0 评论 -
二-类加载子系统
2.1 概述如果要重新一个Java虚拟机,主要考虑类加载器和执行引擎2.2类的加载器与类的加载过程加载Class文件,class文件在文件开头有特定标识类加载器ClassLoader只负责class文件加载,是否可以运行,由执行引擎ExecutinEngine决定加载的类信息存放于一块叫方法区的内存空间1.class file存在于本地硬盘上2.class file加载到JVM中,被称为DNA元数据模板,放在方法区3.在.class文件->JVM->元数据模块,Class原创 2020-08-19 18:14:43 · 185 阅读 · 0 评论 -
一-Java与JVM体系结构
1.1 Java/JVM1.2 JVM整体结构方法区和堆是多个线程共享的。栈,本地方法栈,程序计数器是每个线程独有一份的。JVM架构模型:基于栈,跨平台性,指令集小,指令多;执行性能比寄存器差1.3 JVM生命周期虚拟机的启动:Java虚拟机的启动时通过引导类加载器(bootstrp class loader)创建个初始类(initial class)来完成的,这个类是有虚拟机的具体实现指定的虚拟机的执行:程序开始执行时才运行,程序结束时就停止虚拟机的退出:某线程调用Runtime类原创 2020-08-19 12:31:44 · 177 阅读 · 0 评论