JVM
文章平均质量分 80
不是章鱼的章鱼哥
马达马达达内
展开
-
JVM(八)运行时数据区之方法区
JVM(八)运行时数据区之方法区方法区同堆一样,也是线程共享,并且具有垃圾回收动作的一块区域,用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据。(上图根据jdk不同版本,有细微区别)方法区可以说只是一个逻辑区域,而实际上不同的虚拟机有着对方法区不同的实现。对于Hotspot来说,随着Jdk版本的演进,方法区的落地实现也有很大的区别,主要还是体现在jdk6,7,8三个版本中。首先还是说说方法区主要存放了哪些信息吧。1.类型信息这里说的类型包括class、inte原创 2021-04-08 17:29:58 · 247 阅读 · 0 评论 -
JVM(七)运行时数据区之堆
堆栈,对于刚学习java的同学来说都不陌生,都知道堆管内存,栈管引用。例如:Person p=new Person();这句代码,p是一个Person类型的变量,存在栈中,而new Person()则是在堆中开辟了一块内存空间,用来存储p的实际数据信息。在前面讲完栈之后,我们知道p是存在栈中的局部变量表里,那么学习完堆之后,大家应该会有更深的理解。堆是虚拟机所管理的内存中最大的一块,堆不同于前面说的程序计数器、本地方法栈、虚拟机栈,堆是被线程共享的,在虚拟机启动时被创建。堆内存的唯一目的就是存放对象实例,原创 2021-04-06 15:14:30 · 124 阅读 · 0 评论 -
JVM(六)方法调用(补充知识)
方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还未涉及方法内部的具体运行过程。一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(也就是直接引用)。这个特性给Java带来了更强的动态扩展能力,但也使得Java方法调用过程变得相对复杂,这些调用需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。1.解析所有方法调用的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段原创 2021-04-05 16:48:28 · 206 阅读 · 2 评论 -
JVM(五)运行时数据区之虚拟机栈(Java栈)
Java栈示意图Java虚拟机栈与程序计数器、本地方法栈一样,也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行时,虚拟机都会同步创建一个栈帧(Stack Frame,下面讲解)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用到执行完毕的过程,就对应着一个栈帧的入栈和出栈。栈帧栈中的元素称为栈帧,栈帧中存储了方法的局部变量表、操作数栈、动态连接、方法返回地址和一些附加信息。一个栈帧需要分配多少内存,并不会收到程序运行期变量原创 2021-04-02 11:44:59 · 189 阅读 · 0 评论 -
JVM(四)运行时数据区之程序计数器和本地方法栈
运行时数据区(概念模型,各款虚拟机具体实现有所不同)由于程序计数器和本地方法栈比较简单,就放在一个篇章进行讲解。1.程序计数器程序计数器是一块比较小的内存空间,它可以看作是当前线程所执行的字节码的行号提示器。由于Java虚拟机的多线程是通过线程轮流切换、分配处理器时间片来实现的,所以一个处理器(或一个内核)都只会执行一条线程中的指令,因此每条线程都会有一个独立的程序计数器用来保存程序执行情况。各线程互不影响,独立存储,我们称这类内存区域为“线程私有”。如果线程正在执行的是一个Java方法,这个计数原创 2021-04-02 10:17:32 · 194 阅读 · 1 评论 -
JVM(三)类加载子系统之类加载过程
1.加载加载(Loading)阶段是整个类加载(Class Loading)过程中的一个阶段,Java虚拟机需完成以下三件事情: 1)通过一个类的全限定名来获取定义此类的二进制字节流 2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问入口第一条规则并没有指明二进制字节流必须从某个Class文件中获取,例如:从zip包读取,Jar、War等;网络中获取,Web Applet;运.原创 2021-04-01 14:28:23 · 205 阅读 · 1 评论 -
JVM(二)类加载子系统之类加载时机
类加载子系统示意图Java代码执行流程类加载时机 一个类型从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析统称为连接。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言地运行时绑定特性(也称为动态绑定或晚期绑定)。这些阶段通常都是互原创 2021-04-01 09:59:37 · 140 阅读 · 1 评论 -
JVM(一)Java虚拟机基本结构
JVM(一)Java虚拟机基本结构java虚拟机结构示意图1.类加载子系统 负责从文件系统或网络中加载class文件,classLoader只负责class文件加载,是否可以运行由执行引擎决定。加载的类信息存放于方法区,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)2.运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。其中包含程序计数器(Pr原创 2021-03-31 22:58:43 · 250 阅读 · 4 评论