JAVA与C++之间最大的区别之一就是内存动态分配与垃圾回收技术,在C++中,内存的回收由程序员来控制,而在JAVA中则由java虚拟机来自动进行回收、管理。java虚拟机在执行程序的时候通过将它管理的内存分为若干个不同的数据区域,从而对内存进行管理。主要包括以下几个数据区域:
1、程序计数器
程序计数器是一块较小的内存空间,用来表示当前线程运行字节码的位置。每个线程都有自己独立的一个程序计数器,它属于线程私有。
2、JAVA栈
Java栈也是线程私有的,用来描述Java方法执行的内存模型;栈由栈帧组成,每个方法调用的时候都会创建一个栈帧用于存储局部变量表、操作数栈以及动态链接和方法出口等信息;从中也可以看出,java虚拟机的指令集是基于栈帧的指令集架构,而X86是基于寄存器的指令集,两者各有其优缺点:基于栈的指令集代码更紧凑,编译更简单,而基于寄存器的指令集运行速度更快
3、JAVA堆
Java堆是虚拟机管理的最大区域,它为所有线程共享; 此区域唯一的目的就是存放对象实例,所以它是垃圾收集器管理的主要区域。
4、方法区
方法区各Java堆一样,也是所有线程共享,主要用于存储加载类的信息、常量,静态变量等。其中运行时常量池是方法区一个非常的部分。其详细介绍参见博文:Java常量池概述(待续)
5、本地方法栈
本地方法栈与虚拟机栈的作用比较类似,它主要用于java的Native方法服务调用过程中。
参考:《深入理解Java虚拟机——JVM高级特性与最佳实践》