
JVM那些事
文章平均质量分 70
JVM那些事
梦里藍天
不积跬步,无以至千里;不积小流,无以成江海
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
通过字节码查看int/Integer是如何比较的,为什么nteger(127)==Integer(127)
先看下面三组比较public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; System.out.println(i1 == i2); Integer i3 = 200; Integer i4 = 200; System.out.println(i3 == i4); Integer i5 = 200; int i6 = 200; System.out.printl原创 2021-04-17 19:08:12 · 287 阅读 · 0 评论 -
JVM虚拟机垃圾回收中的finalization机制
finalization机制JVM虚拟机再进行内存中的垃圾回收时,会先判断对象中的finalize()方法是否被重写,被重写的方法是否与GC Roots有直接或间接的联系,从而决定当前对象是否被回收,这就是JVM的finalization机制。finalize()方法finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。finalize()方法由一个虚拟机自动创建的、低优先级的Finalize原创 2021-03-23 20:02:52 · 321 阅读 · 0 评论 -
一篇文章了解Java虚拟机,Java虚拟机内存详解
虚拟机介绍Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如原创 2020-08-04 18:29:11 · 2269 阅读 · 0 评论 -
字符串intern方法与大厂面试题解
intern方法intern方法的作用就是尝试将一个字符串放入StringTable中,如果不存在就放入StringTable并返回StringTable中的地址(如果这个字符串是通过new String()方式创建的,则StringTable内放置的就是new String生成的对象的地址,而不是实实在在的字符串值),如果存在的话就直接返回StringTable中的地址。这是jdk1.7、1.8版本中intern方法的作用,jdk1.6版本中有些不同,1.6中intern尝试将字符串对象放入String原创 2021-02-23 23:13:03 · 273 阅读 · 3 评论 -
字符串拼接操作在底层是如何操作的?
首先看下在日常开发中我们操作字符串拼接的集中方式: public static void main(String[] args) { String s1 = "a"+"b"+"c"; String s2 = "abc"; String s3 = s2+""; final String s4 = "abc"; String s5 = s4+""; System.out.println("s1==s2:" + (s1 == s2)); //true System.原创 2021-02-22 21:45:13 · 455 阅读 · 0 评论 -
JVM虚拟机运行时数据区のStringTable 字符串常量池
什么是StringTableStringTable 字符串常量池,是专门用来保存字符串的一块内存,它的底层数据结构是HashTable,每个元素都是key-value结构,采用了数组+单向链表的实现方式。再jdk1.6以前默认大小是1009,jdk1.7以后默认大小是60013,1.8以后允许设置的最小大小为1009。过小的字符串常量池对性能有很大的影响。所有的字符串都保存到StringTable中吗?答案是否定的,并不是所有字符串都是保存到字符串常量池中,我们知道,再创建字符串是我们一般使用2中方法原创 2021-02-21 20:53:04 · 302 阅读 · 0 评论 -
JVM错误日志hs_err_pid****.log分析
<!-- 日志头文件开始 --><!-- 告诉你在Java运行环境检测到一个致命的错误 --># A fatal error has been detected by the Java Runtime Environment: -> <!-- EXCEPTION_ACCESS_VIOLATION (0xc0000005) 异常访问或非法访问,pc=0x000000006ef835ea 程序计数器的值,pid=2936 进程号,tid=0x0000000000000原创 2021-01-21 11:23:50 · 4050 阅读 · 0 评论 -
JVM虚拟机运行时数据区の逃逸分析
堆是分配对象存储的唯一选择吗 或者说 对象只能在堆上分配吗?在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述: .随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是 如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。 这样就无原创 2021-01-16 22:23:47 · 234 阅读 · 0 评论 -
JVM虚拟机运行时数据区の对象在堆内存中分配的过程
初始伊甸园区内存满经过一次GC伊甸园区内存满经过一次GC后伊甸园区清空,后面新建的对象还是往伊甸园里放,伊甸园区不可达对象清理,可达对象年龄+1放到to区,同时to与from互换。伊甸园区内存满经过二次GC伊甸园区内存满经过二次GC后伊甸园区清空,后面新建的对象还是往伊甸园里放,伊甸园区不可达对象清理,可达对象年龄+1放到to区,同时检查from区中的对象是否可达,可达对象年龄+1并移动到to区,不可达清理。同时to与from互换。经过多次(默认15)GC后,对象年龄到达15的移动到老年代。原创 2021-01-13 17:29:44 · 205 阅读 · 0 评论 -
JVM虚拟机运行时数据区の堆内存设置大小
原创 2021-01-13 17:22:12 · 333 阅读 · 0 评论 -
JVM虚拟机运行时数据区の堆
堆得特点一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在原创 2021-01-13 17:16:47 · 121 阅读 · 0 评论 -
JVM虚拟机运行时数据区の本地方法栈
什么是本地方法本地方法就是JVM所在的运行环境中的方法,比如windows系统或者linux系统中用C或者C++编写的方法。本地方法的出现主要是因为JAVA无法对操作系统底层进行操作,但是可以通过本地方法接口JNI(java native interface)调用其他语言来实现底层的访问。Java中如何实现本地方法在Java方法上添加native关键字即可调用本地方法(当然不像一句话说的这么简单,还需要遵循JNI的规范)。一个native方法就是一个Java调用非Java代码的接口。在定义一个nat原创 2020-12-29 21:19:33 · 167 阅读 · 0 评论 -
JVM虚拟机运行时数据区の栈
栈每当虚拟机启动一条线程时,虚拟机就会在内存中开辟一块栈空间,因此,栈空间是私有的,栈只有2种操作,入栈与出栈。每当线程调用当前类(当前线程正在执行的类称为当前类)方法时(当前类执行的方法称为当前方法),都会将,新栈压入,成为当前帧(在栈顶的栈帧称为当前栈帧)。每一个栈帧包含的内容有局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息。在编译代码时,栈帧需要多大的局部变量表,多深的操作数栈都可以完全确定的,并写入到方法表的code属性中。stack:操作数栈深度locals:局部变原创 2020-12-24 18:57:02 · 191 阅读 · 1 评论 -
JVM虚拟机运行时数据区のPC寄存器(程序计数器)
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。程序计数器是线程私有的,它的生命周期与线程相同(随线程而生,随线程而灭)。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的原创 2020-12-24 18:37:19 · 189 阅读 · 2 评论 -
JVM虚拟机运行时数据区の方法区详解
方法区 1.8之前的永久代,之后的元空间方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区是JVM规范中的对堆内存管理的规范,而永久代或者元空间是对规范的具体实现,JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,之后1.8种元空间替代方法区。元空间本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用原创 2020-12-24 18:25:04 · 301 阅读 · 1 评论 -
Eclipse中使用javap反编译字节码
javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。主要用来查看编译器生成的字节码。这样能让我们更好的知道编译器对我们的代码做了什么。eclipse下配置eclipse中点击工具栏: Run > External Tools > External Tools Configuration双击 Program添加配置Name: javaplocation: D:\java\bin\javap.exe(自己的javap.exe路径原创 2020-12-24 17:49:03 · 517 阅读 · 0 评论 -
JVM虚拟机运行时数据区
运行时数据区都包含哪些区域在class文件通过类加载子系统正常加载后,程序就来到了运行时数据区开始顺序执行,运行时数据区包含哪些区域,这些区域又是如何配合执行的呢?先来看图(图片中各部分占用的比例并不是真正的按实际内存比例画的)可以看到,运行时数据区主要包含:方法区:堆空间,栈空间,程序计数器,本地方法栈5部分。这里先说一下每个部分的主要功能,对于详细的解释,在单独文章来说。方法区方法区是一个抽象的概念,在JVM规范中并没有指定具体该怎么实现,类似像Java的接口,具体实现每个虚拟机可能多少有些不原创 2020-12-24 17:48:32 · 170 阅读 · 0 评论 -
JVM类加载的双亲委派机制
抛砖引玉:JVM是如何把 String class 加载进来呢?我们来猜想下。首先,String 类属于 Java 核心类,位于 $JAVA_HOME/jre/lib 目录下,该目录下的类会由 BootstrapClassLoader 进行加载。没错,它确实是由 BootstrapClassLoader 进行加载。但,这种回答的前提是你已经知道了 String 在 $JAVA_HOME/jre/lib 目录下。那么,如果你并不知道 String 类究竟位于哪呢?或者我希望你去加载一个 unknown原创 2020-12-23 17:41:33 · 360 阅读 · 0 评论 -
分享一个学习JVM的桌面1920*1080
使用360桌面把桌面图标收纳到盒子里,桌面只显示这张图,实时看加深印象!原创 2020-12-23 17:32:47 · 232 阅读 · 0 评论 -
一个字节码文件加载到JVM虚拟机都发生了什么
看一下字节码文件总的生命历程图中第一阶段的加载阶段就是一个class文件加载到JVM的过程,可以看到,整个过程可以分成3个大的阶段,其中中间一个过程又分成的3个小的阶段。从加载器加载到链接,其中链接又分为验证,准备,解析,最后是初始化。类的加载过程Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器会读取这个 .class 文件,并转换成 java.lang.Class 的实例。有了该 Cla原创 2020-12-23 17:27:41 · 448 阅读 · 0 评论 -
JVM发展过程中出现过哪些优秀的虚拟机
Sun Classic VM早在1996年Java1.0版本的时候,Sun公司发布了一款名为sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。这款虚拟机内部只提供解释器。如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。现在hotspot内置了此虚拟机。Exact VM为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。Exa原创 2020-12-22 17:39:05 · 278 阅读 · 0 评论 -
JVM虚拟机的架构模型
栈栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。寄存器寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路原创 2020-12-22 17:36:31 · 316 阅读 · 0 评论 -
JVM是个什么东西,是怎么来工作的?
JVM介绍JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM的工作方式Java虚拟机本质上就是一个程序,当它在命令行上启动的时原创 2020-12-22 17:35:21 · 516 阅读 · 0 评论