深入理解Java虚拟机 - Java内存区域

运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 根据《Java虚拟机规范(Java SE 7版)》 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示。程序计数器程序计数器: …… 阅读全文

深入理解Java虚拟机 - HotSpot虚拟机对象探秘

对象的创建虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程,在类加载检查通过后,接下来虚拟机将为新生对象分配内存。假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把 …… 阅读全文

深入理解Java虚拟机 - OutOfMemoryError异常

在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都 有发生OutOfMemoryError(下文称OOM)异常的可能下文代码的开头都注释了执行时所需要设置的虚拟机启动参数(注释中“VM Args”后面跟着的参数),这些 参数对实验的结果有直接影响,可在Eclipse IDE中设置如下:-verbose:gc -Xms20M -Xmx20M -Xmn10 …… 阅读全文

深入理解Java虚拟机 - 类文件结构

无关性的基石各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石。实现语言无关性的基础仍然是虚拟机和字节码存储格式。 Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。Class类文件的结构任何一个Clas …… 阅读全文

深入理解Java虚拟机 - 字节码指令集

Java虚拟机的指令由一个字节长度的、 代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。字节码与数据类型在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。 例如,iload指令用于从局部变量表中加载int型的数据到操作数栈中,而fload指令加载的则是float类型的数据。 …… 阅读全文

深入理解Java虚拟机 - 泛型与类型擦除

泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(Parametersized Type)的应用,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、 接口和方法的创建中,分别称为泛型类、 泛型接口和泛型方法。Java语言中的泛型只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型了,并且在相应的地方插入了强制转换代码,因此,对于运行期的Java语言来 …… 阅读全文