![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 93
哈哈哈张大侠
不积跬步无以至千里
展开
-
JVM:JVM内存区域划分和内存模型
a的值还会为1吗,重排序看来,操作1和操作2并没有数据依赖的关系,因此操作2可以先于操作1执行,相应的,进入了循环后,就可能出现操作1没有执行的情况,此时读取到的变量a的值就可能为0,所以我们说重排序破坏了可见性,因为按照代码而言此时循环内读到的a肯定为修改后的值,但是却由于重排序读到了老值,也就是共享变量的修改线程B没有立即得知。但是对于成员变量是所有线程共享的,因此在每个线程的工作空间内,在对共享变量进行操作时都会存有一份共享变量的拷贝(工作空间),并基于此拷贝进行修改,再写入主存。原创 2023-04-03 23:17:55 · 375 阅读 · 0 评论 -
JVM:基本原理之垃圾回收
概念:一段代码片中,引用关系不会发生变化,在这个区域任何地方GC都是安全的,线程执行到安全区域的代码时,首先标识自己进入了安全区域,这样GC时就不用管进入安全区域的线层了,线层要离开安全区域时就检查JVM是否完成了GC Roots枚举,如果完成就继续执行,如果没有完成就等待直到收到可以安全离开的信号。总的来说还是值得的。缺点:老年代的对象可能引用新生代的对象,就是说在标记存活对象的时候,需要扫描老年代中的对象,如果该对象拥有对新生代对象的引用,那么这个引用也会被作为 GC Roots。原创 2023-04-03 23:16:56 · 80 阅读 · 0 评论 -
JVM:基本原理之异常的捕获
上述的复制finally代码块的内容是针对字节码而言,针对下图的异常执行路径,编译器会生成一个或多个异常表的条目,监控整个try catch代码块,并捕获所有的异常种类(在 javap 中以 any 指代),该异常条目的target将指向出口处复制的异常代码,并且,在这个 finally 代码块的最后,Java 编译器会重新抛出所捕获的异常。编译生成的字节码文件中,每个方法都附带一张异常表,异常表每一个条目代表一个异常处理器,并且由 from 指针、to 指针、target 指针以及所捕获的异常类型构成。原创 2023-04-02 22:34:57 · 305 阅读 · 0 评论 -
JVM:基本原理之类的加载
class文件被加载入jvm之前,这个类无法知道其他类及其方法对应的地址,此时编译器会生成一个符号引用,而链接阶段需要做的就是将符号引用指向真正的地址,如果符号引用还未被加载,此时则会触发这个类的加载,解析阶段未必会在链接时触发,但是在执行字节码之前,如果包含了符号引用,那就会触发解析。静态常量在编译阶段就会被存入调用类的常量池中,不会引用到定义常量的类,这是一个特例,需要特别记忆,不会触发类的初始化,也就会说static final修饰的String类型和基本类型的常量不会被初始化。原创 2023-04-02 22:34:13 · 54 阅读 · 0 评论 -
JVM:基本原理之java代码的运行
在运行过程中,每当调用一个方法,会给当前线程的java方法栈中生成一个栈帧,用于存放局部变量和字节码的操作数。退出当前执行的方法时,不管是正常返回还是异常返回,Java虚拟机都会执行当前线程的该方法的弹栈操作。虚拟机将栈细分为面向Java方法的Java方法栈,面向本地方法的本地方法(用C++写的native方法,在jdk源码中有大量使用)栈,以及存放各个线程执行位置的PC寄存器。Hot Spot对于大部分不常用的代码采取解释执行的方式运行,对于常用的代码将其编译成字节码,以达到理想的运行速度。原创 2023-04-02 22:30:13 · 128 阅读 · 0 评论