JVM的内存组成
首先JVM的组成是分为了共享区和私有区:
- 共享区:包含了方法区和堆。
- 私有区:包含了程序计数器PC、虚拟机栈和本地方法栈。
方法区(Method Area):方法区存放了静态变量、常量、虚拟机加载的类的信息。垃圾回收器是很少对方法区的内容进行垃圾回收的,垃圾回收器在方法区主要回收的内容是常量以及类型卸载的信息,对于静态变量是不进行回收的,但是如果我们定义的静态变量是一个引用类型的话,被引用的对象是有可能被回收的。
堆(Heap):存放的是程序运行时所创建的对象实例,堆是垃圾回收的主要区域。
程序计数器(Program Counter):程序计数器就是指当前线程所执行的字节码指令的行号指示器,比如分支、跳转、循环、异常处理、线程恢复都需要依赖程序计数器来实现。在Java多线程是通过线程轮流切换来分配时间片来执行的,为了线程切换后能恢复到正确的位置,所以每个线程都有单独的程序计数器。
虚拟机栈(VM Stack):线程私有,主要为Java的方法服务。当线程创建的时候,虚拟机栈会为线程分配一块内存的区域,在线程执行的过程中,调用的每个方法都会创建一个栈帧。在栈帧中用于存放局部变量,操作栈、动态链接、方法出口等,每个方法从被调用到执行完都对应着一个栈帧在虚拟机中从入栈到出栈的过程。
本地方法栈(Native Method Stack):与虚拟机栈很相似,区别在于虚拟机栈是为执行Java方法时所提供的的,而本地方法栈是为执行本地方法(操作系统级别的底层方法)时所服务的。