java内存区域详解

Java内存区域是java程序在执行过程中,它的运行时数据区是如何分布与运作的。

java内存区域详解

主要有5大类:

一。程序计数器。

    程序计数器用来记录Java字节码执行过程中,它执行到了哪一步,简单来说就是执行到某行的行号指示器

    例如程序中分支,循环,跳转等等这些都是通过程序计数器记录执行到哪一步,更加形象的理解就是在debug时候单步执行的指针,当然这里的程序计数器是针对字节码

    每个线程独立拥有一个程序计数器,独立存储于线程的私有内存

二。虚拟机栈。

    虚拟机栈用来干什么呢,就是在真正执行的位置。每个方法在将要执行时,向虚拟机申请“执行栈“,然后将该方法入栈进行执行,执行完的步骤出栈,直到完全出栈,方法完成。

    这个栈都存储了哪些数据了呢?有局部变量表,操作数,动态链接,方法出口等,就是一个方法中包含的数据信息和执行信息。

    注意,如果申请的栈超过限定大小就会抛*异常,虚拟机一般都是可以动态扩展,即使可扩展,超过限定仍然会抛异常OutOfMemoryError。例如一个错误的递归就可能导致申请空间过大,造成*。

三。本地方法栈。

    本地方法栈从作用来讲和虚拟机栈是类似的,只不过虚拟机栈是给Java方法来使用的,而本地方法栈是给Native方法服务的。有时会用java调用c++代码,这时会调用本地方法,就会存储运行于本地方法栈。

四。Java堆。

    Java堆就是用来存储对象的地方,Java是面向对象的编程语言,”万物皆对象“,因此这个地方是jvm管理内存中最大的一块。由于GC的需求,jvm还将Java堆按照GC的需求划分了新生代,老年代的区域。

    Java堆是所有线程共享的内存区域,在虚拟机启动时创建。

五,方法区。

    方法区用来存储加载到虚拟机的类信息,常量,静态变量,即时编译器编译后的代码等数据。简单来说就是存储类的,其中有个重要的区域:运行时常量池,即存储常量的表。

    方法区也是所有线程共享的内存区域。