java内存区域

  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方法分配的堆外内存,通过堆内的引用进行操作。

原文地址:https://www.cnblogs.com/notejava/p/7197895.html