摘要:
对象头在32位系统上占用8B,64位系统上占16B。 无论是32位系统还是64位系统,对象都采用8字节对齐。Java在64位模式下开启指针压缩,比32位模式下,头部会大4B(mark区域变位8B,kclass区域被压缩),如果没有开启指针压缩,头部会大8B(mark和kclass都是8B),换句话说 阅读全文
摘要:
HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) 1.对象头 HotSpot虚拟机的对象头(Object Header)包括两部分信息, (1)第一部分MarkWord:用于存储对象自身的运行时 阅读全文
摘要:
栈帧中存储的有 局部变量表 操作数栈(或表达式栈) 动态链接(或指向运行时常量池的方法引用) 方法返回地址(或方法正常退出时或者异常退出时的定义) 一些附加信息 一、局部变量表 是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在 Java 程序编译为 Class 文件时,就在方法的 阅读全文
摘要:
方法区就用来存储了每一个类的结构信息,不同的虚拟机实现是不一样的,有些叫永久代,有些称为元空间 1、类型信息 类型的全限定名 超类的全限定名 直接超接口的全限定名 类型标志(该类是类类型还是接口类型) 类的访问描述符(public、private、default、abstract、final、sta 阅读全文
摘要:
java设计者将内存划分为不同的区域,每一块区域都有它自已的职责,粗略的分工如下:堆区是专门用来存储对象的,方法区是专门用来保存类的结构信息的,虚拟机栈是专门用来执行java方法的,本地方法栈是专门用来执行native方法的,程序计数器是专用记录线程执行字节码所执行的行号记录的。java内存区域统称 阅读全文
摘要:
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器 阅读全文
摘要:
编写原则 在JDK1.2之前,在自定义类加载器时,总会去重写loadClass方法,从而实现自定义的类加载类,但是JDK1.2之后已不再建议用户去覆盖loadClass方法,而是建议把自定义的类加载逻辑写在findClass方法中 在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URL 阅读全文
摘要:
符号引用 符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用和虚拟机的布局无关。 个人理解:在编译的时候一个每个java类都会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,多以就用符号引用来代替,而在这个解析阶 阅读全文
摘要:
前言 Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到 阅读全文
摘要:
类的卸载:由JVM自带的类加载器所加载的类,在JVM的生命周期中,始终不会被卸载。JVM本身会始终引用这些类加载器,而这些类加载器始终引用它们所加载的类的Class对象。所以说,这些Class对象始终是可触及的。 由用户自定义的类加载器所加载的类是可以被卸载的。 当类被加载,连接和初始化后,它的生命 阅读全文
摘要:
类加载器 VM 中有多个类加载器,分饰不同的角色。每个类加载器由它的父加载器加载。bootstrap 加载器除外,它是所有最顶层的类加载器。 Bootstrap 加载器 使用C/C++语言实现的,因为它在 JVM 加载以后的早期阶段就被初始化了。bootstrap 加载器负责载入基础的 Java A 阅读全文
摘要:
一、为什么要使用类加载器? Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如: 1.编写一个面向接口的应用程序,可能等到运行时再指定其实现的子类; 2.用户可以自定义一个类加载器,让程序在运行时从网络或其他地 阅读全文