1、java虚拟机在运行的时候会把内存分为以下几个区域,如图:
运行时数据区,学习java虚拟机必须要弄清楚这里所有的区概况及作用.
1) 程序计数器:线程私有,一块较小的内存,行号指示器,字节码解释器工作时就是通过改变这个计数器的值,来选下一条字节码指令,比如分支,循环,跳转,异常 处理,线程恢复等基础功能靠这个计数器来完成。ps:由于java的多线程是线程轮流切换的,一个处理器(多处理器叫一个内核)同一时刻只会执行一条线 程,所以必须保证这个程序计算器是线程私有的 。此内存区域是唯一一个没有规定任何内存溢出的地方。
2)java虚拟机栈,这也是程序员所关心的两块内存中的一块,栈内存。
特点: 1、线程私有 2、生命周期与线程相同 3、描述的java方法执行的内存模型。
描述 :一个线程执行会有至少一个方法,没当线程进入一个方法,会在虚拟机栈创建一个栈帧,用于存储局部变量表(基本7种数据类型,对象引用)、操作帧,方法出 口等信息。每一个方法被调用即入栈,完成即出栈。当然我们通常说的栈 ,就是局部变量表。虚拟机栈会出现两种异常,当虚拟机请求栈的深度大于所允许的深度,会抛出StackOverFlowerError,虚拟机栈扩展到无 法拥有足够的内存,会抛出OutOfMemoryError。
3)本地方法栈。和虚拟机栈作用一样,执行的都是native方法,即本地方法,随线程而生,随线程而死。
4)堆。我们最关注的一块,先说下他们的几个特点。
特点:1、内存最大的一块;2、被所有线程共享;3、虚拟机启动的时候创建;4、目的:存放对象的实例。
5)方法区:被所有线程共享,存储内容:
1、虚拟机加载的类信息;
2、常量
3、静态变量
4、即时编译器编译后的代码
此区域包括了运行时常量池。方法区内存回收较少,一般是两种,常量池回收,类型卸载。
6)直接内存,非java虚拟机的一部分,也会频繁使用、