java在运行过程中会把内存分为若干区域。分别是
1.程序计数器
程序计算器是一块较小的内存,是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等功能都依赖于这个计数器来完成。
2.java虚拟机栈
java虚拟机栈是线程私有的,生命周期与线程相同。每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作栈,动态链接、方法出口等信息。java虚拟规范中,对该区域定义了两种异常。如果线程请求的栈深度超过虚拟机运行的深度则抛StackOverflow异常,如果线程无法横向扩展时,抛OutOfMemoryError异常。
3 本地方法栈
本地方法栈和java虚拟机栈类似,区别时,本地方法栈为虚拟机使用到的native方法服务。
4 java堆
java堆是最大的一块内存。线程共享。堆内存可分为新生区和老年区。新生区又分为Eden区、From Suvivor区、to Suvivor区。
5 方法区(java8后叫永久区)
方法区线程共享,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6 运行时常量区
运行时常量区是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池。用于存放编译期生成的各种字面量和符号引用,这部分将在类加载后存放到方法区的运行时常量池中。
7 直接内存
直接内存不是java运行时数据区的一部分。可以由本地native方法分配的堆外内存,通过堆内的引用进行操作。