JVM
文章平均质量分 85
期华_
珍惜现在,便是把握未来。
展开
-
JVM方法区的基本概念&方法区的演进
文章目录栈、堆、方法区的交互关系方法区概述方法区在哪?方法区的理解方法区内存大小的设置常见解决方法区OOM的方案方法区里面存储什么运行时常量池方法区有GC吗?方法区的垃圾是什么?对常量池的回收对不再使用的类型的回收方法区的演进细节永久代为什么要被替换成元空间?StringTable为什么要调整?栈、堆、方法区的交互关系方法区概述方法区在哪?《Java虚拟机规范》中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotspotJ原创 2021-05-17 21:03:36 · 575 阅读 · 1 评论 -
Java中的逃逸分析技术
对象内存分配过程在了解逃逸分析前,先大概的看一下逃逸分析技术在对象分配过程中的应用针对不同年龄段的对象分配原则优先分配到Eden区大对象(过长的字符串、数组)直接分配到老年代,尽量避免程序中出现过多的大对象长期存活的对象分配到老年代动态对象年龄判断如果survivor区中相同年龄的所有对象所占内存大小的总和大于survivor空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。空间分配担保:-XX:Handl原创 2021-04-08 15:08:13 · 438 阅读 · 0 评论 -
Java中String面试难题
文章目录前置知识`String str = "xxx"`到底new了几个对象?思考?new String("xxx")到底new了几个对象?`new String("ab") + new String("c")` 到底new了几个对象?思考?`string.intern()`在不同jdk版本的变化?面试题前置知识String str = "xxx"到底new了几个对象?new String("xxx")到底new了几个对象?new String("xxx") + new String("xx")原创 2021-03-31 14:22:49 · 232 阅读 · 0 评论 -
字符串常量池的基本特征
文章目录String的基本特性String的不可变性字符串常量池的理解字符串拼接操作验证关于StringBuilder的拼接操作经典面试题关于intern()的效率问题1. 从时间的角度2. 从空间的角度G1垃圾收集器对String的去重操作String的基本特性在了解字符串常量池之前,先看一下String的一些基本特性String:字符串,使用一对""引起来表示。 // 字面量的定义方式 string sl = "hello"; // new的方式 Strin原创 2021-03-08 22:27:28 · 281 阅读 · 0 评论 -
JVM之【堆】的基本概念
文章目录堆的核心概念堆内存结构细分新生代与老年代对象分配的正常过程堆的核心概念Java堆区在JVM启动的时候即被创建。是JVM管理的最大一块内存空间,是GC执行垃圾回收的重点区域。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域,GC和OOM都存在。《Java虚拟机规范》规定,堆可以处于物理上可以为不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,但并不是共享堆的全部,内部同样存在每个线程私有的缓冲区(如:ThreadLocal Alloc原创 2021-02-20 18:10:10 · 338 阅读 · 0 评论 -
JVM栈(5)-----方法返回地址&一些附加信息
方法返回地址存放调用该方法的方法pc寄存器的值。一个方法的结束,有两种方式:正常执行完成出现未处理的异常,非正常退出无论通过哪种方式退出,在方法退出后都返回该方法被调用的字节码指令位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。异常退出时,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。当一个方法开始执行后,只有两种方式可以退出这个方法:执行引擎遇到任意一个方法返回的字节码指令(return),会有返回值传递给原创 2021-01-29 09:55:02 · 404 阅读 · 0 评论 -
JVM栈(4)-----动态链接
动态链接每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如: invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里,比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。运行时常量池存储在方法区方法的调用方法的调用就是将符号原创 2021-01-29 09:53:33 · 2073 阅读 · 2 评论 -
JVM栈(3)-----操作数栈
是什么我们平常说的Java栈/JVM的执行引擎是基于栈的执行引擎,其实指的栈都是操作数栈用于在方法执行过程中,根据字节码指令往栈中写入数据或提取数据,即入栈和出栈,主要用于作为变量的临时存储空间,同时保存计算过程中的中间结果。某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用它们后再把结果压入栈,比如: 执行复制、交换、求和等操作。操作数栈是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,会创建一个新的栈帧,这时候栈帧中的操作数栈是空的(空的不代表没有长度)原创 2021-01-29 09:52:02 · 696 阅读 · 0 评论 -
JVM栈(2)-----局部变量表
局部变量表 Local Variables局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(引用类型)。局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。每一个方法的执行都对应着一个栈帧的入栈。一般来说,栈越大,方法嵌套调用次数越多。对一个函数而言,它的参数和局部变量越多,会使得局部变量表越大,所原创 2021-01-29 09:49:40 · 419 阅读 · 0 评论 -
JVM栈(1)-----栈的作用是什么?
文章目录虚拟机栈出现背景内存中的栈与堆Java虚拟机栈基本内容栈中可能出现的异常设置栈的内存大小栈中存储什么?栈帧的内部结构虚拟机栈出现背景由于Java跨平台的设计,Java指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能设计为基于寄存器的。优点:指令集小,编译器容易实现缺点:性能较低,实现同样的功能需要更多的指令。内存中的栈与堆栈是运行时的单位,而堆是存储的单位栈解决程序运行时的问题,即程序如何去执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放、放在哪儿对于原创 2021-01-29 09:48:07 · 952 阅读 · 0 评论 -
Java对象内存分配流程
内存分配流程针对不同年龄段的对象分配原则优先分配到Eden区大对象(过长的字符串、数组)直接分配到老年代,尽量避免程序中出现过多的大对象长期存活的对象分配到老年代动态对象年龄判断如果survivor区中相同年龄的所有对象所占内存大小的总和大于survivor空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。空间分配担保:-XX:HandlePromotionFailure对象分配过程:TLABTLAB,全称原创 2021-01-29 09:42:32 · 1347 阅读 · 0 评论 -
对JVM执行引擎的理解
文章目录概述执行引擎的工作过程Java代码编译和执行的过程解释器&编译器Why???JVM如何选择的?热点代码及探测方式编译方式编译器的分类其他编译器(了解)概述“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但原创 2021-01-09 16:49:49 · 285 阅读 · 0 评论 -
JVM程序计数器的基本理解
概述PC寄存器(程序计数器)用来存储指向下一条字节码指令的地址,也就是即将要执行的字节码指令,由存储引擎读取下一条指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。PC寄存器是一块非常小的内存空间,是运行速度最快的存储区域。在JVM规范中,每个线程都有自己独立的程序计数器,生命周期与线程的生命周期保持一致。任何时间一个线程只能有一个方法在执行,也就是所谓的当前方法,程序计数器会存储当前线程正在执行的Java方法的JVM指令地址,如果正在执行的方法为native方法,原创 2021-01-08 15:51:38 · 762 阅读 · 1 评论 -
java堆核心概念
文章目录堆的核心概念堆内存结构细分新生代与老年代堆的核心概念Java堆区在JVM启动的时候即被创建。是JVM管理的最大一块内存空间,是GC执行垃圾回收的重点区域。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域,GC和OOM都存在。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,但并不是共享堆的全部,内部同样存在每个线程私有的缓冲区(如:ThreadLocal Allocation Buffer原创 2021-01-08 10:08:56 · 155 阅读 · 0 评论 -
Java中直接内存的理解和基本使用
概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。I来源于NIO(jdk1.4),通过DirectByteBuffer对象操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存Java的NIO库允许Java程序使用直接内存,用于数据缓冲区可能导致OOM:java.lang.OutOfMemoryError: Dire原创 2021-01-07 20:31:43 · 1992 阅读 · 0 评论 -
JVM中的类加载器子系统
文章目录总览类加载阶段概述类加载器的分类双亲委派机制用户自定义类加载器链接阶段的三个过程初始化阶段概述总览类加载器负责从文件或网络中加载class文件,在class文件的开头必须有特定的标识才可以被识别。类加载器只负责class文件的加载,至于它是否可以运行,取决于ExecutionEngine决定Class File 加载到JVM中被称为DNA元数据模板,存放在方法区。方法区除了存放类的基本信息外,还可以存放运行时常量池信息,可能还包括字符串字面量和数据常量(这部分常量信息是class文件中常原创 2020-10-31 21:54:23 · 380 阅读 · 3 评论