问题缘由:
c与c++内存管理由开发人员管理,但是Java的内存管理交给了虚拟机,一旦出现内存泄露和溢出问题,就需要了解虚拟机的内存使用
Java虚拟机运行时数据区划分:
程序计数器:控制代码执行的行,Java虚拟机每个线程都配备计数器。
Java虚拟机栈:每个方法执行时,会同步创建一个栈帧,方法的调用与完成对应一个栈帧从虚拟机栈中入栈到出栈,会抛出栈深度溢出和栈扩展失败异常
本地方法栈:与虚拟机栈类似,本地方法栈为虚拟机使用到本地方法服务,也会抛出栈深度溢出和栈扩展失败异常。
Java堆:虚拟机管理内存最大一块,唯一目的是存放对象实例,几乎所有对象实例和数组都在堆上分配,Java堆是垃圾搜集管理器的内存区域,Java堆被细分的原因是为了更好的回收内存和分配内存。
方法区:存储已经被虚拟机加载的类型信息,常量,静态变量,编译后的代码缓存等数据。以前通过永久代来实现方法区,容易出现内存溢出,jdk6开始逐渐使用本地内存的元空间来实现。
运行时常量池:方法区的一部分,信息存放在class文件里,受方法区内存限制。
直接内存:不属于虚拟机运行时数据区的部分,受到本机的内存大小限制,在native堆场景等能提升效率