简单描述一下JVM中运行时内存的组成
在JVM中的运行数据区中,主要有程序计数器,虚拟机栈,本地方法栈,堆,方法区,运行时常量池等。下面简单介绍一下这几个区的作用。
程序计数器
程序计数器主要用于记录正在执行的字节码指令的地址。它是线程私有的,每个线程都有一个,所以不存在线程并发问题。
虚拟机栈
是每个线程运行时所需要的内存,由栈帧组成,对应每次调用方法所占用的内存,每个线程只能有一个活动栈帧。
同时虚拟机栈中不涉及垃圾回收机制,栈帧弹出后内存就会释放。
若方法内局部变量没有逃离方法都作用范围,则是线程安全的。若局部变量逃离作用范围或引用了对象,则会出现线程安全问题。
同时,栈帧过多或栈帧过大会导致内存溢出。
方法区
方法区主要用于存放类信息、常量、静态变量、即时编译器编译后的代码等。
堆
主要用于保存对象和数组等,是所有线程共享的内存区域。划分为年轻代和老年代。在年轻代主要划分为三部分,由eden区,存放新创建的对象和两个survior区组成。老年代一般存放生命周期较长的对象。在java1.7版本中,堆内存还存有永久代,在1.8中永久代被划分到了本地内存元空间中。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 精神内猫!






