
jvm
文章平均质量分 70
一个欧维
我不懒!!!
展开
-
运行时数据区 - 方法区
① 栈、堆、方法区的交互关系Person person = new Person();//Person => .class方法区//person => 栈//new Person() => 堆空间Java栈空间中的一个Slot存储了person的reference引用,指向堆空间中Person的一个实例,然后堆空间中的Person实例中存在一个对象类型数据的指针,指向方法区中的对象数据类型。② 方法区的理解《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上属于原创 2022-03-15 21:32:28 · 488715 阅读 · 0 评论 -
堆、栈、常量池
1. 常量池常量池用于存放被Public static final修饰的字段。例如当我们创建常量时:例如Public static final String str = "something";时,会在常量池存储"something"。常量池的优势是可以避免频繁的创建和销毁对象而影响性能,且在常量池中的变量实现了共享。当在程序运行中执行String str = "abc"时,不会在常量池存储新的abc,而是首先检查常量池是否存在"abc",若存在,则在栈中创建String str对象存储常量池中ab原创 2021-08-07 00:37:09 · 314868 阅读 · 0 评论 -
jvm - 逃逸分析
堆是分配对象的唯一选择吗?不是。随着Java的发展和逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术会使原有的绝对堆上分配发生一些微妙的变化。逃逸分析如果一个对象并没有逃逸出方法的话,那么就可能被优化为栈上分配。如果有个对象在方法中被定义,且只在方法内部使用,则认为它没有发生逃逸。当一个对象在方法中被定义后,它被外部方法引用,则认为发生了逃逸。如何将一个会逃逸的对象变成非逃逸对象?//逃逸public StringBuilder test() { StringBuilder原创 2022-02-23 23:34:07 · 484739 阅读 · 0 评论 -
运行时数据区 - 堆
① 堆的核心概念一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动时就被创建,其空间大小也确定下来(允许参数设置)。是JVM管理的最大一块内存空间。<<Java虚拟机规范>>规定,堆可以处于物理机上不连续的内存空间中,但逻辑上应该被视为连续的。虽然所有线程共享堆,但是堆空间中还有一部分区域被划分为了线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。这是为了提升并发效率而设计的。如果说一个栈空原创 2022-02-23 23:31:52 · 494735 阅读 · 0 评论 -
运行时数据区 - 虚拟机栈
① 概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点:跨平台,指令集小,编译器容易实现。缺点:性能下降,实现同样的功能需要更多的指令。是什么?Java虚拟机栈,早期也叫Java栈。每个线程再创建时都会创建一个相对应的虚拟机栈,其内部保存着一个个栈帧,对应着一次次的Java方法调用。虚拟机栈是线程私有的。生命周期与线程的生命周期相同。作用管理Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回原创 2022-02-23 17:14:51 · 488891 阅读 · 0 评论 -
运行时数据区 - 程序计数器
① 介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。PC寄存器用来存储指向下一条指令的地址(即将要执行的指令代码),由执行引擎读取下一条指令。它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域。每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。任何时间一个线程都只有一个方法在执行,也就是当前方法。程序原创 2022-02-23 17:13:14 · 494673 阅读 · 0 评论 -
双亲委派机制
Java虚拟机对Class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的Class文件加载到内存生成Class对象。而且加载某个类的Class文件时,Java`虚拟机采用的是双拼委派模式,即把请求交给父类处理,它是一种任务委派模式。如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。如果父类还存在父类加载器,则进一步向上委托,依次递归。最终请求到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就由父类加载,倘若无法完成,则才由子类原创 2022-02-23 17:10:50 · 484332 阅读 · 0 评论 -
JVM - 类加载与子系统
1. 类加载与子系统类加载器子系统负责从文件系统或网络中加载Class文件,Class文件在开头有特定的文件标识。ClassLoader只负责Class文件的加载,至于是否可以运行,则由Execution Engine来决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池(Constant pool)信息,可能还包括字符串字面量和数字常量。1) 类加载步骤① 加载阶段通过一个类的全限定名称获取定义此类的二进制字节流。将Class文件从磁盘或者网原创 2022-02-23 17:08:34 · 494362 阅读 · 0 评论