JVM专题
1024吧
今天最好的表现是明天最低的要求
展开
-
一步步教你计算java对象的大小
目录内存布局引入依赖测试案列排序规则一计算公式(M+C+I)%=0关闭指针压缩结论1结论2排序规则二计算公式(m+c+l)%8 !=0结论内存布局总计(byte):(m+c+f+p+l)%8=01、mark word->m2、class对象指针->c3、类字段->f4、补齐位->p5、如果是数组还有数组长度->l引入依赖 <dependency...原创 2020-01-02 16:28:16 · 717 阅读 · 1 评论 -
如何用代码验证对象头的存在
Java对象头的组成Java对象的对象头由 mark word 和 klass pointer 两部分组成,MarkWord:哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向的线程ID。类型指针:指向类元数据指针,方法区的Class模板。示例数据:实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。对齐填充:对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的...原创 2019-12-30 22:43:28 · 345 阅读 · 0 评论 -
javac编译.java文件过程
目录词法分析语法分析语义分析中间代码生成前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。我们所熟知的javac的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把.java代码转换成.class代码。词法分析词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符...原创 2019-12-16 21:08:00 · 370 阅读 · 0 评论 -
类加载ClassLoader和双亲委派机制
类加载器的发生时间是在类加载过程的加载阶段发生的。类加载器1.Bootstrap Class Loader会加载rt.jar下面的C++代码(启动类加载器)2.Extension Class Loader会加载ext/*.jar下面的代码(扩展类加载器)3.System Class Loader会加载用户自定义的代码(应用程序类加载器)用程序打印类加载器package all;p...原创 2019-12-15 21:02:00 · 156 阅读 · 0 评论 -
类加载过程
类加载的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中验证、准备和解析三个部分统称为连接。加载1.根据类的全限定名获取类的二进制字节流2.二进制字节流代表的静态结构转化为方法区运行时的数据结构3.内存创建Class对象,作为方法区这个类的各种访问入口连接验证验证Class文件是否符合虚拟机的规范,保证被加载类的正确性文件格式验证元数据验证字节码...原创 2019-12-15 18:50:31 · 137 阅读 · 0 评论 -
类文件结构详解
@[类文件结构class文件是一种8位字节的二进制流文件,class文件中的信息是一项一项排列的, 每项数据都有它的固定长度,其中u1、u2、u4、u8分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。ClassFile { u4 magic; // 魔法数字,表明当前文件是.class文件,...原创 2019-12-15 14:21:13 · 183 阅读 · 0 评论 -
字节码指令表(查找使用)
字节码助记符指令含义0x00nop什么都不做0x01aconst_null将null推送至栈顶0x02iconst_m1将int型-1推送至栈顶0x03iconst_0将int型0推送至栈顶0x04iconst_1将int型1推送至栈顶0x05iconst_2将int型2推送至栈顶0x06iconst_3将int...原创 2019-12-14 21:09:04 · 260 阅读 · 0 评论 -
JVM垃圾回收(一)
java的堆和方法区他们都是线程共享,内存的分配和回收都是动态的,因此垃圾收集器所关注的都是这部分内存。在进行回收前垃圾收集器第一件事情就是确定哪些对象还存活,哪些已经死去。下面是两种基础的算法:引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时计数器就+1,当引用失效时计数器就-1,。只要计数器等于0的对象就是不可能再被使用的。此算法在大部分情况下都是一个不错的选择,也有一些著名的...原创 2019-11-26 10:59:54 · 170 阅读 · 0 评论 -
JVM内存结构
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而建立和销毁。程序计数器每条线程都有一个独立的程序计数器。程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示...原创 2019-11-20 20:44:08 · 238 阅读 · 0 评论 -
JVM对象的创建过程
对象的创建判断是否已经执行类加载当虚拟机遇到一条new指令时 ,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那必须先执行相应的类加载过程。分配内存当已经执行过类加载过程后,会为新对象在Java堆中分配一个大小已经确定的内存,具体的内存分配规则有两种:指针碰撞(Bump the Pointer) ...原创 2019-11-16 23:28:25 · 202 阅读 · 0 评论 -
JVM对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3个区域:对象头(Header)、示例数据(Instance Data)、对其填充(Padding)对象头(Header)HotSpot 虚拟机的对象头包括两部分(非数组对象)信息,如下图所示:第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对...原创 2019-11-16 20:37:12 · 176 阅读 · 0 评论 -
访问对象两种方式(句柄访问和直接指针)
java对象这里指的是引用类型的对象,这里用Student stu = new Student()为例子访问,Student stu作为引用对象,存在java的虚拟机栈上,new Student()保存在Java堆中,堆中记录Student类型的信息包括方法,接口,对象类型等地址,这些类型的执行的数据存储在方法区中。主要的对象的访问方式有句柄访问和直接指针访问:句柄访问句柄访问主要是Ja...原创 2019-11-15 15:37:38 · 1616 阅读 · 3 评论 -
JVM学习笔记->正确理解Java可以跨平台(有图)
程序的执行流程过程解读:程序刚开始是.java的文件,通过编译成为.class文件,接下来通过类加载器,把.class文件加载到内存JVM的运行时数据区,JVM然后在不同的操作系统上运行。自己见解1.JVM首先是面向操作系统的,不是面向硬件的。2.一次编写到处运行不是说写完java代码到处可以运行,有个前提就是在不同的操作系统上需要安装不同的JVM虚拟机。3.JVM是解释型和编译型语...原创 2019-11-07 10:58:48 · 189 阅读 · 0 评论