- 博客(13)
- 资源 (16)
- 收藏
- 关注
原创 Java虚拟机——Java内存模型
主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,这里的变量包括了实例字段、静态字段和构成数组对象的元素。Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作...
2020-02-21 21:04:13 110
原创 Java虚拟机——方法调用
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。解析所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中一部分符号引用转化为直接引用。静态方法、私有方法、实例构造器和父类方法,这四类方法在类加载的时候就会把符号引用解析为该方法的直接引用,这些方法称为非虚方法...
2020-02-14 15:14:17 120
原创 Java虚拟机——运行时栈帧
栈帧是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。局部变量表局部变量表用于存放方法参数和方法内部定义的局部变量。局部变量表的容量以变量槽Slot为最小单位,一个Slot可以存放一个32位以内的数据类型,对于64位的数据类型,虚拟机会以高位在前的方式为其分配两个连续的Slot空间。虚拟机通过索引定位的方式使用局部变量表,索引值...
2020-02-14 10:48:07 107
原创 Java虚拟机——双亲委派模型
虚拟机把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块被称为“类加载器”。比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义;这里的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInsta...
2020-02-13 16:06:11 108
原创 Java虚拟机——虚拟机类加载机制
虚拟机类加载机制,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。Java类的生命周期:加载、验证、准备、解析、初始化、使用、卸载必须对类进行“初始化”的情况:a、使用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候、调用一个类的静态方法的时候;b、使用java.lang.reflect包的方法对...
2020-02-12 16:40:29 69
原创 Java虚拟机——Class类文件结构
Class文件时一组以8位字节为基础单位的二进制流。Class文件格式采用一种类似于C语言结构体的伪结构体来存储,这种伪结构体重只有两种数据类型:无符号数和表。无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。表是由多个无符号数或其他表作为数据项构成的复...
2020-02-11 15:43:16 109
原创 Java虚拟机——Java虚拟机性能监控
jps:虚拟机进程状况工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类函数所在的名称,以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。jstat:虚拟机统计信息监视工具用于监视虚拟机各种运行状态信息的命令行工具,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。可选参数如下图所示 jin...
2020-02-11 11:00:54 216
原创 Java虚拟机——Java内存分配原则
Java内存分配原则对象优先分配在Eden区;大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。大对象直接进入老年代;大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串及数组。虚拟机提供了参数 -XX:PretenureSizeThreshold,大于这个设置值的对象直接在老年代中分配。...
2020-02-11 09:54:22 178
原创 Java虚拟机——垃圾收集器
1、Serail收集器单线程收集器,该收集器在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束,该行为称之为"Stop the world"。主要用于Client模式下的虚拟机2、ParNew收集器Serial收集器的多线程版本。运行在Server模式下的虚拟机中首选的新生代收集器。除了Serial收集器,只有该收集器能与CMS收集器配合使用。默认开启的收集线程数与CPU数量相同。...
2020-02-02 18:12:08 85
原创 Java虚拟机——垃圾收集算法及优缺点
1、标记-清除算法该算法分为两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点:a、效率问题,标记和清除过程的效率都不高;b、空间问题,标记清除后会产生大量不连续的内存碎片。2、复制算法该算法将内存按容量划分为大小相等的两块,每次只使用其中的一块,当这块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。缺点:...
2020-02-02 17:13:59 246
原创 Java虚拟机——对象访问
以下面这句代码为例Object obj = new Object()Object obj这部分反映到Java栈的本地变量表;new Object()这部分反映到Java堆,存储Object类型所有实例数据值的结构化内存;Java虚拟机实现的对象访问方式主要有两种:使用句柄和直接指针1、句柄访问方式,Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,...
2020-02-01 13:24:41 119
原创 Java虚拟机——运行时数据区
Java运行时数据区如下图所示1、程序计数器程序计数器可以看作是当前现成所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我...
2020-01-31 12:56:39 117
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人