11.数组
数组也是类的对象。具有相同类型和维数的数组属于同一个类(不管长度只看维数)。数组的长度属于对象实例。多维数组也是一维数组。如二

维数组,即为一个一维数组,该一维数组的每个元素是一个数组的引用。数组和普通对象一样也存储在堆中。
数组名为数组的引用,通过索引即数组标号来访问数组内容。

12.异常
在java栈帧的帧数据区内保存有针对该方法的异常表的引用。异常表记载了该方法的字节码(*.class)受catch子句保护的范围(即try子句里的

字节码)。当某个方法抛出异常时,虚拟机在对应的异常表中寻找匹配的catch子句,并将控制权交给catch子句中的代码。

13.java执行引擎
实现平台无关性,以java方法帧里的操作数栈为中心,将局部变量数组当作cpu的寄存器。每操作一个数据都要压人操作数栈,然后返回至局部

变量区。java虚拟机规定强类型转换,即低精度可以隐式转换到高精度,高精度必须强制转换到低精度。

14.线程
线程即存在于进程中的某个执行体。
每个线程必须遵守对象锁定,线程等待和通知。
对象锁定使线程互斥的访问对象资源。等待和通知则是遵守线程合理调度以达到同一个目的。java对象通过指令集达到上锁目的,同过继承

object类的wait(),notify(),notifyall()方法来等待和通知。当某个线程调用某个对象的wait()方法时,该线程被阻塞,并加入到该对象的线

程阻塞队列中,直到另一个线程调用同一对象的通知方法,才能唤醒阻塞队列中的线程。

15.常量池
常量池用来存放类型的各种信息,包括类型的各种直接常量,和对其他类型,字段,方法的符号引用。
常量池分为两种,存储在.class字节码中的常量池和存储在方法区中的运行时常量池。
常量池以入口形式(类似于中断向量表)出现,每个入口都指向一个表,表中存储常量的信息。但从常量池的入口的标志位就可以判断对应的表

中存储的常量类型。
常量池入口以一个标志位开始,该标志位指示该常量的类型。每个入口对应一个表,该表以符号_info结尾,表中存放常量的压缩形式。
常量池除了存放直接常量外还容纳如下几种符号引用:
类和接口的全限定名。
字段名称和描述符(该描述符是一个指示字段类型的字符串。字段是一个类或接口的类变量或实例变量)。
方法名称和描述符(该描述符指示方法返回类型,参数类型,数量,顺序)。

运行时,虚拟机用常量池的全限定名和方法,字段的描述符来建立类与类的关系。

常量池仅仅是一个引用和描述符的集合,并不接受任何赋值操作。

所有对象的创建,方法和类变量的调用均要从常量池中获取信息,但实例变量的调用从堆里获得。(猜想)

符号引用是由虚拟机解析后得到具体的地址来使用。

常量池解析就是将常量池中的符号引用替换成直接引用。

当要使用某个类的方法或字段时,首先从常量池中找到该方法或字段的符号引用,然后进行解析,找到其物理地址。

把代码中出现的各种符号引用,类与类的联系,进行常量池解析,叫做动态连接。

16.常量池结构
常量池由很多狠多的单元组成,每一个单元都形如(入口|内容),访问常量池单元时通过索引找到入口,然后访问其内容。但有时单元的内容也

可能是一个常量池入口(比如类或接口的常量池单元,入口包含该类的符号引用即constant_class_info,而内容则指向一个

constant_utf8_info的常量池单元,该单元里存放了该类的全限定名)。而直接常量如int,float等,内容处就是常量的值。

17.方法区的结构
方法区存储所有关于类型,接口的信息。方法区包含:

常量池:存储类型的直接常量和所有的字段,方法,其他类型的符号引用(仅仅是引用,并不存放具体信息)。

字段信息:所有声明的字段(包括字段名,类型,修饰符)。

方法信息:所有定义的方法(包括方法名,返回类型,修饰符,方法的字节码,方法栈帧的大小,方法的异常)。

类变量信息:虚拟机在方法区中为所有类变量分配空间,以后的初始化,赋值等操作也在方法区中进行,以便为所有类实例共享。

为提高访问速度,虚拟机在方法区中为每个非抽象类设置了一个方法表,该表是一个数组,每个元素是一个方法的直接引用。当类的对象调用

方法时,就在方法表中搜索(抽象类没有实例,所以不用调用方法,所以没有方法表)。

18.堆
堆存放类的实例和数组(包括实例变量,指向对应方法区中类数据的引用)。

19.一个例子
class test{
public static void main(string args[])
{
string a=new string("hello");
string b=new string("hello");
string c="hello";
string d="hello";
}
}
则a==b返回false,c==d返回ture。
因为:==比较双方是否是同一个对象。

首先:
string a=new string("hello")
string b=new string("hello")
a和b分别各自新建了hello的对象和引用变量,即在堆中有两个hello,他们各自的引用是a和b。

而:
string c="hello"
string d="hello"
先建立一个字符串类实例hello,再建立两个字符串引用变量c和d,然后让c和d都指向开始建立的hello实例。因此c和d指向的是同一个对象。

java虚拟机学习笔记2相关推荐

  1. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  2. Java虚拟机学习笔记(一)—Java虚拟机概述

    一:编程语言兼容底层系统的方式大概分为两种 1.通过编译器实现兼容 例如C.C++等编程语言,既能运行与Linux系统,也能运行与Windows系统:既能运行于x86平台,也能运行于AMD平台.这种能 ...

  3. 深入理解JAVA虚拟机学习笔记(一)JVM内存模型

    摘要:   上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状 ...

  4. Java 虚拟机学习笔记 | 运行时数据区总结

    前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...

  5. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  6. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  7. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析

    每天进步一点点! 今天我们一起看一下类加载的准备阶段和解析阶段. 先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段. 这里面的区 ...

  8. java outofmemory_深入理解JAVA虚拟机学习笔记3——OutOfMemoryError异常

    开门见山. 为了方便制造溢出,将JAVA堆的大小调整为10M. 本机用的是IntelliJ IDEA作为开发工具,进入到IDEA的安装目录,如D:\tools\IntelliJ IDEA 2017.1 ...

  9. java虚拟机学习笔记 【3】

    为什么80%的码农都做不了架构师?>>>    认识Java虚拟机的内部体系结构 Java虚拟机的内部体系结构也许很少有人去关心,因为对于Java程序员来说,一般只需要跟API打交道 ...

  10. Java虚拟机学习笔记(一)--运行时数据区域

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 前言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域. 程 ...

最新文章

  1. Microsoft NLayerApp案例理论与实践 - 项目简“.NET研究”介与环境搭建
  2. BZOJ1861:[ZJOI2006]书架(Splay)
  3. 数据库中一些知识的整理
  4. 关于NSKeyedArchiver的编码格式
  5. dom4j-2.1.1 jaxen-1.1.6 读取xml数据源
  6. android wifi连接手机,Android手机无线连接利器-AirDroid
  7. C#LeetCode刷题之#226-翻转二叉树(Invert Binary Tree)
  8. 在windows服务器开启php的gd库出错
  9. Cortex-M系列处理器指令集区别详解
  10. ai训练 样本大小_防止过拟合(三):数据增强(增加训练样本)
  11. H3C进入目录---用户视图
  12. Java后台集成融云即时通讯IM
  13. python画画excel_用Python在Excel里画出蒙娜丽莎的方法示例
  14. 【 移动硬盘安装Ubuntu18.04】
  15. RocksDB Compaction(一)介绍
  16. 计算机太极图怎么设计,怎么用cad2010画太极图
  17. DI的概念和实现原理—Spring系列介绍
  18. 边用边学计算机英语,译学馆 - 边玩边学英语?你也可以! - Android 应用 - iPad - 【最美应用】...
  19. Paper之EfficientDet: 《Scalable and Efficient Object Detection—可扩展和高效的目标检测》的翻译及其解读
  20. eclipse报错!!!!

热门文章

  1. linux压缩分区大小,linux如何无损调整分区大小的详细介绍
  2. linux系统查看系统配置
  3. 多年来,程序员经常加班的真相终于揭开了…
  4. C语言学习记录——유 分支与循环(2)
  5. CV影视TV版3.0.3最新版 家中观影利器
  6. 双极型晶体管---三极管
  7. VMware 15 上Mac虚拟机不能全屏问题的解决
  8. SQL Server developer和enterprise有什么区别?以及各个版本的定义
  9. 从0开始学递归和分治
  10. 堪比病毒营销的新思路:换个姿势玩抖音!