深入理解JVM虚拟机
今天你学习了么
这个作者很懒,什么都没留下…
展开
-
JVM - java对象模型
1. 类加载的过程 ① 加载指的是根据一个类的全限定名将 (class文件) 定义此类的二进制字节流读入内存 虚拟机规范并没有指明二进制文件是从哪里获取,也就是说并不一定是从class文件中获取,还可以通过以下方式获取 运行时计算生成 我们经常使用的动态代理技术就是这样,在java.lang.reflect.Proxy中使用ProxyGenerator.generateProxyClass来为特定接口生成形式为*$Proxy的代理类的二进制字节流 由其他文件生成 我们用到的JSP文件也可以生成对应的原创 2020-11-06 10:53:42 · 134 阅读 · 0 评论 -
JVM - 运行时数据区 - 对象的创建和布局
1. 对象的创建 JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象 虚拟机在遇到new指令时,首先回去检查要实例化的这个类是否被加载,解析,初始化过,之后开始对象的创建 1.1 对象创建的方式 1. new 2. Class的newInstance()反射创建,只能调用空参的构造器 3. Constructor的newInstance()反射方法,可以调用带参的构造器 4. clone()方法 5. 使用反序列化 6. 第三方类库Objenesis 1.2 对象创建的原创 2020-11-05 19:56:26 · 151 阅读 · 0 评论 -
JVM - 运行时数据区 - 方法区
1. 栈,堆,方法区的交互关系 2. 方法区的基本理解 方法区是线程共享的内存区域,在Java规范中把方法区作为堆的一个逻辑部分,方法区的大小决定了系统可以保存多少类,如果加载了大量类可能会导致OOM 方法区用来存储已经被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码缓存等数据 在jdk1.6的内存结构中,使用永久代来实现了方法区(对于Hotspots) 在1.8方法区不再由JVM管理而是放在了元空间中,元空间放到本地内存中,而且相对于1.6来说,串池StringTable被放到了堆中 版原创 2020-11-03 21:04:46 · 219 阅读 · 0 评论 -
JVM - 运行时数据区 - 虚拟机栈
1. 基本概念 虚拟机栈描述的是Java方法执行的内存模型 栈是运行时的单位,堆是存储的单位 栈解决的是程序运行时问题,即程序如何执行,或者说如何处理数据 堆解决的是数据存储的问题,即数据怎么放,放在哪里(栈也可以放,放基本类型数据,对象引用,returnAddress类型) 线程私有 该区域也是线程私有的,其生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型,主管Java程序的运行,它保存方法的局部变量(8中基本数据类型,对象的引用地址),部分结果,并参与方法的调用和返回 OutOfMemor原创 2020-10-31 21:01:52 · 184 阅读 · 1 评论 -
JVM - 运行时数据区 - PC寄存器
程序计数器(程序钩子) 1. 简介 它的作用可以看做是当前线程所执行的字节码的行号指示器 在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 我们称这类内存区域为“线程私有”的内存 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会原创 2020-10-27 20:26:38 · 219 阅读 · 0 评论 -
JVM - 整体结构
1. 整体结构 2. JVM的生命周期 虚拟机的启动 Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的,这个类是由虚拟机的具体实现指定的 当我们执行一段java代码的时候,必须先加载这个类,类加载器是用来负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例; 而在夹在当前类的时候要把父类给加载了,一层一层往上就通过引导类加载器创建一个初始类,启动了java虚拟机 虚拟机的执行 一个运行的java虚拟机有着一个清晰的任务:执行java程序 程序开始执行时他才运行,程原创 2020-10-25 20:15:55 · 133 阅读 · 0 评论 -
JVM -运行时数据区 - 堆
1. 概述 Java堆是Java虚拟机所管理的内存中的最大的一块,Java堆是线程共享的一块内存区域,虽说堆是线程共享的,但是堆中也可以分划分线程私有的缓冲区(TLAB,Thread Local Allocation Buffer) 堆唯一的目的就是存放对象的实例,几乎所有的实例都是在这里分配内存的;注意这里说的是几乎,对象也可以不分配在堆上,这里涉及到逃逸分析等,之后再说; 堆可以物理上不连续,只要逻辑上连续即可; Java堆是垃圾收集器管理的主要区域,因此也被称为GC堆,在方法结束以后堆中的对象并不会立原创 2020-10-25 16:41:44 · 150 阅读 · 0 评论 -
JVM - 执行引擎
1. 概述 虚拟机是一个相对物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是建立在处理器,缓存,指令集和操作系统层面上的,而虚拟机执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集和执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式 JVM的主要任务是负责装载字节码到期内部,但是字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅是一些能够被JVM所识别的字节码指令,符号表,以及其他辅助信息 为了让一个Java程序跑起来,执原创 2020-05-18 13:10:46 · 222 阅读 · 0 评论 -
JVM - 类文件结构
1. 平台无关性 将编写的程序直接编译成二进制的本地机器码(native code)已经不再是唯一的选择了,越来越多的程序语言选择了与操作系统和机器指令集无关的,平台中立的格式作为程序编译后的存储格式 与平台无关的理想最终实现在操作系统的应用层上,Sun公司和其他虚拟机提供商发布了可以运行在各个不同平台上的虚拟机,这些虚拟机可以载入和执行同一种平台无关的字节码,从而实现一次编写,处处运行 2. Class类文件的结构 Class文件对应着唯一一个类或者接口的定义信息,Class文件是一组以8位字节位基础单位原创 2020-05-14 20:38:11 · 114 阅读 · 0 评论 -
JVM - 垃圾收集器与内存分配策略
1. 概述 在JVM的运行时数据区中,程序计数器,本地方法栈,虚拟机栈都是线程私有的,随线程生而生,随线程灭而灭,他们的内存分配和回收都具有确定性,但是堆和方法区则不同,一个接口的多个实现类需要的内存可能不一样,一个方法中多个分支所需要的内存可能也不一样,这部分的内存的分配和回收都是动态的,垃圾收集器所关注的就是这部分内存 2. 判断垃圾 垃圾指的是不可能再被使用的对象,主要有两种方法判断哪个对象成为了垃圾(死亡),一个是引用计数法,另一个是可达分析 2.1 引用计数法 引用计数法是为每个对象分配一个引用计原创 2020-05-14 12:15:01 · 257 阅读 · 0 评论 -
JVM - 运行时数据区
1. 运行时数据区内部结构 内存是非常重要的系统资源,是硬件和CPU的中间仓库和桥梁,承载着操作系统和应用程序的实时运行; JVM内存布局规定了Java在运行过程中内存申请,分配,管理的策略,保证了JVM的高效稳定运行,不同的JVM对于内存的划分方式和管理机制存在部分差异(比如方法区的不同) 一个JVM的实例对应着一个Runtime实例,一个Runtime实例就相当于对应着一个运行时数据区 2...原创 2020-03-25 12:47:37 · 344 阅读 · 0 评论 -
JVM - 类加载子系统
学习清单: 深入探讨 Java 类加载器 老大难的 Java ClassLoader 再不理解就老了 好怕怕的类加载器 1. 类加载子系统的作用 类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程 类加载器子系统负责从文件系统或者忘了中加载class文件,class文件在文件头有特定的标识(cafe baby) ClassLoade...原创 2020-03-24 13:42:54 · 444 阅读 · 0 评论 -
JVM - 从源码到机器码
转载JVM基础系列第4讲:从源代码到机器码,发生了什么? 1. JVM的整体结构 java虚拟机是用来解释jvm字节码文件的(为什么我不说java字节码,因为多语言自由编程的支持,只要被解释成符合标准的字节码文件的语言都能在jvm虚拟机上运行) 2. 前端编译器: 从源代码到字节码 对于 Java 虚拟机来说,输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 ...转载 2020-03-24 09:34:02 · 940 阅读 · 0 评论 -
JVM/ JRE/ JDK
JVM Java虚拟机,是安装在系统里面的可以让windows等识别的软件,用来读取java文件,JVM不跨平台 JRE Java Runtime Environment:Java的运行环境,包含了JVM和核心类库(API类库) JDK Java Developmrnt kit:Java的开发工具包,包含了JRE和Java的开发工具(Java程序设计语言) 为什么要配置环境变量 因为某些exe文...原创 2020-01-15 07:34:19 · 209 阅读 · 1 评论