JVM运行时数据区

Java程序在运行时,数据主要存放在以上几个区域。

程序计数器:

程序计数器即平时常指的PC指针,用于指向程序当前执行的语句的下一句。该区域是线程私有的,即每个运行的线程都有自己的程序计数器,用于存放当前线程将要执行的下一条指令。在多线程程序中,当程序由其他线程跳入此线程时,就通过PC来获得下一条语句所在位置。

方法区:

一块线程共享的区域,主要用于存放虚拟机加载的类信息、常量、静态变量(静态变量是和类相关的)、编译器编译.java后生成的代码等数据。这些数据均在编译器编译时和.class文件关联在一起(其中常量池比较特殊,虽然是和class文件关联,但他也能在程序运行时动态生成,如new String时)。方法区也会发生Garbage Collection,此处的GC主要针对“常量池”,同时也会回收已经不存在引用的类的信息。

堆:

JVM管理的最大的一块内存区域,用于存放对象实例,所有new出的对象都在JVM的堆中有自己的内存区域。这里是GC发生最频繁的地方。为了GC的方便,将堆区分成伊甸区(Eden)、幸存者区(Survivor)、老年代三个部分(还有说法把方法区也称为是堆的一部分,称“永久代”)。伊甸区和幸存者区又合称为新生代。一般新生代的对象“寿命较短”,故采取复制算法进行GC,而老年代对象的存活时间一般较久,一般采取标记-整理算法进行GC。、

栈:

线程私有,生命周期与线程生命周期相同。栈中主要存放栈帧(Stack Frame)。当程序需要执行一个方法时,便在虚拟机栈中产生一个栈帧,栈帧内的信息包括方法内声明的基本数据类型、局部变量表、对象的引用的信息(对象的引用指向堆区)。每当调用一个方法时,编将该栈帧压入虚拟机栈,执行完毕后即弹出。

本地方法栈:

作用类似于虚拟机栈,不同之处在于该栈内存的是程序中的Method 方法。

相关文章:

  • 2021-06-21
  • 2021-10-06
猜你喜欢
  • 2021-05-15
  • 2021-10-16
  • 2021-07-04
相关资源
相似解决方案