java 虚拟机学习笔记(一)

来源:互联网 发布:寿光网络问政平台 编辑:程序博客网 时间:2024/05/15 06:08

一、java 体系结构

JDK(Java Development Kit)包括:Java程序设计语言、JVM、JavaAPI类库,支持Java程序开发的最小环境。

JRE(Java Runtime Environment)包括:Java API 类库中的 Java SE API 子集、JVM ,支持Java程序运行的标准环境。


二、运行时数据区域


1、程序计数器:是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。是线程私有的。

2、虚拟机栈:描述的是java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。是线程私有的

3、本地方法栈:与虚拟机栈的作用相似,区别在于,虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。是线程私有的

4、java堆(Heap):是java虚拟机所管理内存中最大的一块。是所有线程共享的一块内存区域,在虚拟机启动时创建。用于存放对象的实例,也是垃圾收集器管理的主要区域。通过-Xmx和-Xms控制堆的大小。java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。

5、方法区(Method Area):是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。java虚拟机规范把方法区描述成堆的一个逻辑部分。相对而言,垃圾收集行为在这个区域的比较少出现的,这个区域的内存回收目标,主要是针对常量池的回收和对类型的卸载。

运行时常量池(Runtime Constant Pool):是方法区的一个部分。Class文件中除了有类的版本、字段、方法、接口的描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行是常量池中。

运行时常量池相对于Class文件常量池的一个重要特征是具备动态性,java语言并不要求常量一定只能在编译期产生,也就是并非预置入Class文件中的常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,常见的是String类中的intern()方法。

6、直接内存(Direct Memory):并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,也会导致OutOfMemoryError异常的出现,在JDK1.4中新加入NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在java堆和Native堆中来回赋值数据。

显然,本机直接内存的分配不会受到java堆大小的限制,但是,既然是内存,肯定还会收到本机总内存的大小和处理器寻址空间的限制。服务器管理员配置虚拟机参数时,一般会根据实际的内存设置-Xmx等参数信息,单经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制,导致动态扩展时出现OutOfMemoryError异常。



0 0
原创粉丝点击