![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 52
龙门之上
一个程序员
展开
-
new String(“123“)会创建几个对象
解释1.如果字符串常量池中有"123",则不会创建,如果没有则会创建2.同时在堆中创建"123"这个对象深入理解字符串常量池中的“123”public class StringTest { public static void main(String[] args) { String s = "1"; }}结论:常量池中的 "23"是在编译期就已经指定了证明:使用jclasslib查看发现代码中 “1”指定为#2继续追踪可以发现在 class文件的原创 2021-03-31 16:11:33 · 166 阅读 · 0 评论 -
G1垃圾收集器
本文只是随手记录,不一定完全正确存储概念G1算法将堆划分为若干个区域(Region),但仍然属于 分代收集器。在G1中还有一种特殊的区域,叫Humongous区域。如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象。这些巨型对象,它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动原创 2021-03-17 14:47:34 · 261 阅读 · 0 评论 -
CMS(concurrent Mark sweep)垃圾收集器
作用1.8 老年代默认垃圾收集器过程1) 初始标记(CMS initial mark)1.会stw ,首先标记 GC root 对象。哪些是GC root对象呢?1.方法区中常量引用的对象。2.方法区中 类静态变量引用的对象3.虚拟机栈(栈桢中的本地变量表)中的引用的对象 ;4.本地方法栈中JNI的引用的对象2) 并发标记(CMS concurrent mark)根据 初始标记对象 找出所有存活对象并发执行(3)预清理阶段(待详细研究)处理前一个阶段因为引用关系改变导致没有标记到原创 2021-03-17 10:46:43 · 328 阅读 · 0 评论 -
JVM之虚拟机栈(四)栈帧中的 方法返回地址和一些附加信息
方法返回地址(return address)存放调用了该B方法的上一级方法A(栈帧)的 pc寄存器 中的值 (即要执行的下一条指令的指令地址)。将指令地址返回给执行引擎去执行方法A的下一条指令。一个方法的结束,有两种方式:正常执行完成;正常调用完成。出现未处理的异常,非正常退出。异常调用完成无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈原创 2021-02-01 16:22:09 · 687 阅读 · 0 评论 -
JVM之虚拟机栈(三)栈帧中的 动态链接与方法调用机制
动态链接每一个栈帧当中都包含一个指向运行时常量池中该栈帧所属方法的引用(invokedynamic指令)在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里比如:描述一个方法调用的另外的其它方法时,就是通过常量池中指向该方法的符号引用来表示,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。动态链接,就有静态链接,其概念都来自方法调用中的绑定;方法调用:静态链接:当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编原创 2021-02-01 16:21:55 · 529 阅读 · 0 评论 -
JVM之虚拟机栈(二)栈帧中的操作数栈
操作数栈是什么?1.主要用于保存计算过程到中间结果,同时作为计算过程中变量临时的存储空间2.操作数栈是数组,在代码编译过程中就已经确定了大小,保存在方法的code属性中,为max_stack可以通过jclasslib bytecode viewer 查看3.如果被调用到方法带有返回值得话,其返回值会被压入到当前栈帧的操作数栈中,并更新pc寄存器中下一条需要执行的字节码指令(这里就和pc寄存器关联起来了)和pc寄存器 、局部变量表等的关系总结:字节码指令是操作指令集,局部变量表是变量的存储器,原创 2021-02-01 15:00:14 · 309 阅读 · 0 评论 -
jvm之PC寄存器
Pc寄存器是什么?1.Pc寄存器是用来存储指向下一条指令的地址,然后由执行引擎读取PC寄存器中存储的下一条指令2.PC寄存器内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。pc寄存器和虚拟机栈的关联是什么?如下图可以看到pc寄存器存储的是虚拟机栈帧中操作数栈的行号同时可以看到 PC寄存器中存储的就是操作数栈的指令地址,交由java的执行引擎执行1.使用PC寄存器存储字节码指令地址有什么用呢(为什么使用PC寄存器记录当前原创 2021-01-27 20:36:15 · 450 阅读 · 0 评论