|
Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。 一、概述
Java是平台无关的语言,也就是说Java代码可以运行在不同的机器上,要实现这种“一次编码,处处运行”的目标,Java使用虚拟机来消除平台多样性。
Java相比于C和C++不同的一个地方在于,Java程序员不需要手动回收内存,而C/C++需要使用delete/free代码来手动释放不使用的内存。
根据《Java虚拟机规范(Java SE 7 版)》的规定,Java虚拟机在执行Java程序时会把它所管理的内存划分为若干不同的数据区域,如下图。

Java虚拟机运行时数据区
二、运行时数据区域
程序计数器(Program Counter Register):
- 一块较小的内存空间,是当前线程所执行的字节码的行号指示器。
- 每个线程都有一个程序计数器,因此,其是“线程私有”的。
- 此区域是Java虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。
Java虚拟机栈(Java Virtual Machine Stacks)
- 描述的是Java方法执行的内存模型,会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
- 每个线程都有栈,因此,其是“线程私有”的。
- Java虚拟机规范中对这个区域规定了两种异常:StackOverflowError(深度不足),OutOfMemoryError(空间不足)。
本地方法栈(Native Method Stack)
- 与虚拟机栈所发挥的作用非常相似,区别是虚拟机使用到的Native方法服务,Java虚拟机栈使用的是Java方法(字节码)服务。
- 也是“线程私有”的。
- Java虚拟机规范中对这个区域规定了两种异常:StackOverflowError(深度不足),OutOfMemoryError(空间不足)。
Java堆(Java Heap)
- Java虚拟机所管理的内存中最大的一块。
- 被 所有线程共享,用来存放对象实例,几乎所 有的对象实例都存储在这里分配 内存。
- 垃圾回收器管理的主要区域,也称“GC堆”,基本采用分代收集算法,即,新生代和老年代。
- Java虚拟机规范中对这个区域规定的异常为OutOfMemoryError(空间不足)。
方法区(Method Area)
- 存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,堆的逻辑部分,也称Non-Heap。
- 也是线程共享的区域。
- Java虚拟机规范中对这个区域规定的异常为OutOfMemoryError(空间不足)。
直接内存(Direct Memory)
- 不是虚拟机运行时数据区的一部分,也称堆外内存。
- 也会导致OutOfMemoryError(空间不足)。
|
|