JVM
文章平均质量分 83
ambitfly
这个作者很懒,什么都没留下…
展开
-
JVM总结全
HotSpot 默认虚拟机JRockit HotSpot融合了JRockit jdk8初步融合完成 没有解释器,只有编译器IBM J9 启动类加载器(引导类加载器)Bootstrap ClassLoader 加载java 核心类库,没有父类加载器,只加载包名为java,javax,sun等开头的类 扩展类加载器 Extension ClassLoader 父类加载器为启动类加载器 应用程序加载器 AppClassloader 父类加载器为扩展类加载器,用户编写的类由它加载 自定义原创 2022-12-04 22:07:01 · 427 阅读 · 0 评论 -
JVM 面试速记
对象都会首先在 Eden 区域分配,在进行第一次垃圾回收后存活的对象复制一份放在s0区,删除eden区的对象,在第二次进行垃圾回收时扫描eden区和s0区的对象,把存活的对象复制一份放在s1区,对象的年龄加1(Eden区->Survivor 区后对象的初始年龄变为1),这时s1区变为了s0区,s0区变为了s1区。当一个类接收到加载请求,这个类不会立即去加载,而是委派给自己的父类去加载,每个层次的类都是如此,因此,所有的加载请求都会传入到父类哪里,只有父类加载不了的时候子类才会去加载。原创 2022-11-06 23:44:23 · 311 阅读 · 0 评论 -
JVM 执行引擎
解释器: 当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。JIT (Just In Time Compiler) 编译器: 就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACTfel55-1667138274253)(F:\笔记\img\解释器和JIT编译器的理解图.png)]原创 2022-10-30 21:58:36 · 71 阅读 · 0 评论 -
JVM 对象的实例化内存布局与对象访问
6.执行init方法进行初始化,初始化成员变量,执行实例代码块,调用构造方法,并把堆内的首地址赋值给引用变量。5.设置对象的对象头,将对象的所属类,对象的HashCode,对象的GC信息,锁信息等储存在对象头中。4.初始化分配到的空间,所有属性设置默认值,保证对象实例在不赋值时可以直接使用。 如果内存不规整,虚拟机需要维护一个列表,分配列表中空闲的内存。④ 使用反序列化,从文件中,网络中获取一个对象的二进制流。1.判断对象对应的类是否加载,链接,初始化。 如果内存规整,使用指针碰撞的方式分配。原创 2022-10-07 17:02:26 · 78 阅读 · 0 评论 -
JVM 方法区
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够得 的方法或者字段引用。( 字面量是指双引号引住的一系列字符,双引号中可以没有字符,可以只有一个字符,也可以有很多个字符。 异常表(异常处理的开始位置,结束位置,代码处理在程序计数器中的偏移地址,捕获异常类的常量池索引)特别说明,静态变量的类型是引用类型的,指的就是引用,不是对象,对象本身就是在堆中的。 运行时常量池,在加载类和接口到虚拟机后,就会创建对应的运行时常量池。 域名称,域类型,域修饰符。原创 2022-09-25 23:02:59 · 93 阅读 · 0 评论 -
JVM 堆
而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。如果再次触发垃圾回收,会对伊甸园区和幸存者0区的对象进行垃圾回收,此时幸存者0区还幸存的对象会放在幸存者1区,下次再进行垃圾回收会回收对伊甸园区和幸存者1区的对象,把还幸存的对象放到幸存者0区,循环往复(谁空谁是to)5.由Eden区、s0区向s1区复制时,对象大小大于s1区的可用内存,则把该对象转移到老年代,并且老年代的可用内存小于该对象的大小。原创 2022-09-12 22:48:26 · 264 阅读 · 0 评论 -
JVM PC寄存器和虚拟机栈
另外一种退出方式是,在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,无论是Java虛拟机内部产生的异常,还是代码中使用throw字节码指令产生的异常,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方法的方式称为异常完成出口(Abrupt Method Invocation Completion)。由于 invokevirtual 调用的方法在对应的类的方法表中都有固定的位置,直接索引的值可以用偏移量来表示。在方法运行期间是不会改变局部变量表的大小的。原创 2022-09-05 00:01:28 · 584 阅读 · 0 评论 -
JVM 类加载器子系统
此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并起来。方法是构造器函数(任何一个类声明后,至少会存在一个构造器)构造方法中指令按语句在源文件中出现的顺序执行。不同于类的构造器(构造器是虚拟机视角下的。不同于类的构造器(构造器是虚拟机视角下的。若该类有父类,JVM会保证子类的。若该类有父类,JVM会保证子类的。初始化阶段就是执行类构造器方法。方法在多线程情况下被同步加锁。方法在多线程情况下被同步加锁。虚拟机必须保证一个类的。虚拟机必须保证一个类的。...原创 2022-08-28 15:49:02 · 205 阅读 · 0 评论 -
JVM 类加载器
自定义java.lang.String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt. jar包中java\lang\String.class),报错信息说没有main方法,就是因为加载的是rt. jar包中的String类。当一个类接收到加载请求,这个类不会立即去加载,而是委派给自己的父类去加载,每个层次的类都是如此,因此,所有的加载请求都会传入到父类哪里,只有父类加载不了的时候子类才会去加载。...原创 2022-08-28 15:48:04 · 139 阅读 · 0 评论 -
JVM 方法区
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够得 的方法或者字段引用。( 字面量是指双引号引住的一系列字符,双引号中可以没有字符,可以只有一个字符,也可以有很多个字符。 异常表(异常处理的开始位置,结束位置,代码处理在程序计数器中的偏移地址,捕获异常类的常量池索引)特别说明,静态变量的类型是引用类型的,指的就是引用,不是对象,对象本身就是在堆中的。 运行时常量池,在加载类和接口到虚拟机后,就会创建对应的运行时常量池。 域名称,域类型,域修饰符。原创 2022-08-21 22:30:22 · 236 阅读 · 0 评论 -
寄存器和虚拟机栈
PC寄存器PC寄存器用来储存指向下一条指令的地址,也即将要执行的代码。由执行引擎读取下一条指令。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。PC寄存器是线程私有的。分支,循环,跳转,异常处理,线程恢复都需要依赖计数器完成。它是唯一一个没有规定OutOfMemoryError情况的区域使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?因为CPU需要不停的切换各个线程,这时候切换回来以后,就要知道接着从哪开始继续执行。JVM字原创 2020-10-17 17:09:28 · 288 阅读 · 0 评论 -
各大虚拟机介绍
文章目录虚拟机的雏形SUN Classic VMExact VM现在的三大虚拟机HosSpot VMJRockit VMIBM J9国内的虚拟机TaoBao JVM未来有可能替代HotSpot的虚拟机Graal VM虚拟机的雏形SUN Classic VMJava1.0时Sun公式发布,世界上第一款商用虚拟机,JDK1.4时完全被淘汰内部只提供了解释器,运行比较慢如果使用JIT编译器需要进行外挂,而且一旦使用了JIT编译器,解释器就不会再工作,编译器和解释器不能配合工作现在Hot原创 2020-09-27 09:33:20 · 1442 阅读 · 0 评论 -
类加载器子系统之链接和初始化
文章目录类加载器以及类的加载过程加载阶段加载过程(Loading)链接阶段(Linking)验证(Verify)准备(Prepare)解析(Resolve)初始化(Initialization)示例1示例2实例3实例4类加载器以及类的加载过程加载阶段引导类加载器扩展类加载器系统类加载器链接阶段验证准备解析初始化阶段初始化加载阶段加载过程(Loading)通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态储存结构转化为方法区的运行时数原创 2020-09-27 00:15:48 · 105 阅读 · 0 评论