JVM
文章平均质量分 93
Yanní_G
这个作者很懒,什么都没留下…
展开
-
Java垃圾收集器超详细解析
1.随线程而生的内存程序计数器、虚拟机栈、本地方法栈栈中的栈帧随着方法的进入和退出可以进行自动分配栈帧内存与回收2.堆区内存回收2.1 可达性分析2.1.1 GC Roots虚拟机栈本地变量表中的引用对象,包括传递的参数、局部变量、临时变量等类中静态属性和常量引用的对象(方法区中)本地方法栈中引用的对象虚拟机内部引用synchronize 锁定的对象2.1.2 引用类型与垃圾回收强引用:软引用:内存不够时进行第一次垃圾回收,先保留,看此次收集完之后够不够分配,如果仍然不够再回原创 2021-05-22 22:26:31 · 486 阅读 · 0 评论 -
Java虚拟机字节码执行引擎详解
1. 栈帧结构局部变量表、操作数栈、动态链接、方法返回地址、附加信息2. 局部变量表用于存放方法参数和方法内部定义的局部变量。编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。局部变量表的容量以变量槽为最小单位,局部变量表中的变量槽是可以重用的。如果访问的是32位数据类型的变量,索引N就代表了使用第N个变量槽,如果访问的是64位 数据类型的变量,则说明会同时使用第N和N+1两个变量槽。对于两个相邻的共同存放一个64位数据 的两个原创 2021-02-22 19:32:41 · 205 阅读 · 0 评论 -
Java虚拟机的类加载机制详解
类的生命周期1. 加载加载过程总览通过一个类的全限定名来获取定义此类的二进制字节流。通过字节流的方式把 .class文件放入MetaSpace在堆中生成一个Class对象,指向这个.class文件的地址动态代理类的加载java.lang.reflect.Proxy或者CGLib都是在运行时生成字节码,也可以把这个直接在堆内存中的字节码加载进到MetaSpace,同样堆中生成一个Class对象指向这块内存。数组类的加载如果数组的元素类型是引用类型,而且这个类还没有被放入MetaSp原创 2021-02-21 19:03:43 · 149 阅读 · 0 评论 -
Java类文件结构详解
类文件结构package com.szu.jvm.learn01_bytecode;/* * @Author 郭学胤 * @University 深圳大学 * @Description * @Date 2021/2/20 13:33 */public class L01_EmptyClass {}下图为一个空文件编译出来的class文件1. 魔数和version前四个字节:CA FE BA BE,类文件固定开头,名字叫做魔数(magic number)第五六七八字节:0原创 2021-02-20 16:36:17 · 239 阅读 · 0 评论 -
Java中的强软弱虚四种引用和ThreadLocal
1 强引用1.1 什么是强引用// 情况1static Object o = new Object();// 情况2public void get(){ Object o = new Object();}就是最普通的创建对象方式,当使用new关键字经过创建对象的三个步骤完成之后,对象o此时就有了一个指向堆内存中这个对象的一个引用。1.2 与垃圾回收的关系1.2.1 什么可以作为GC Root由于Java使用的垃圾回收机制是根可达算法,使用为GC Root的对象都有以下几种原创 2021-02-12 21:27:19 · 320 阅读 · 0 评论 -
JVM 内存模型与线程
1 硬件的效率与一致性为了解决CPU与内存的速度差异,引入了高速缓存,如果有多个CPU而且他们又共享同一主存,所以引入了一个新的问题:缓存一致性。为了解决这个问题,需要CPU在访问缓存时都要遵循一定的协议,比如MESI协议(文末有粗略的解释MESI协议,并未深入研究)。2 Java内存模型每条线程有自己的工作内存(类似于cache),工作内存中包括主存中数据的副本,但是不包括线程私有的局部变量和方法参数。如果局部变量是一个reference,他引用的对象在Java堆中被各个线程共享,但是refe原创 2020-12-09 12:17:25 · 174 阅读 · 0 评论 -
JVM 内存区域和对象创建过程
1. 运行时数据区1.1 程序计数器每条线程都有自己的程序计数器,各条线程之间计数器互不影响,独立存储1.2 Java虚拟机栈每个线程start的时候都会创建一个虚拟机栈,每个方法执行的时候虚拟机为其创建栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。方法调用到执行完毕都是栈中入栈到出栈的过程线程的创建数量是与随着栈内存的增多而减少的:这也很容易理解,线程会有一个私有的虚拟机栈,栈内存越大,虚拟机可以创建的线程数越少。栈中的局部变量表基本数据类型,对象引用(reference原创 2020-12-09 00:03:46 · 159 阅读 · 0 评论 -
JVM 线程安全和轻量级锁、重量级锁、偏向锁及其优化
1. 线程安全的实现方法1.1 互斥同步(悲观锁)synchronized特性重量级,Java线程映射到操作系统内核线程,所以会导致用户态到内核态的切换同一条线程是可重入的monitorenter执行时吧对象的锁计数器加一,monitorexit会把计数器减一,减为0时才真正释放锁无法强制已获取锁的线程释放锁,也无法强制正在等待锁的线程中断或者退出This Monitor 和 Class Monitor根据修饰的方法类型来决定取所在的对象实例this还是取类型对应的Class对象原创 2020-12-08 23:53:44 · 372 阅读 · 0 评论