JVM的内存组成?
运行时,JVM分成5个部分,分别是,方法区、堆、程序计数器、虚拟机栈和本地方法栈。

堆(Heap)--是JVM管理的内存中最大的一块,也是最主要的部分,唯一的目的是存放程序运行时所创建的对象实例。堆,是垃圾回收的主要区域。对于不在被使用的对象(不再持有引用的对象)垃圾回收器会对其进行回收和销毁。
方法区(MethodArea)--主要存取虚拟机加载的类的信息,常量、静态变量等数据。
方法区和堆 都是共享的。其中的数据对线程都是开放的,可直接访问。对于存在方法区中的数据,垃圾回收器是很少对其进行回收的。主要回收常量和类型卸载的信息。而静态变量是不进行回收的。不过,如果定义的静态常量是一个引用类型,那么这个被引用的对象时有可能进行回收的。
私有区是线程独有的部分:
程序计数器--当前线程所执行的字节码指令的行号指示器(例如:分支、跳转、循环、异常处理、线程恢复)。Java多线程是通过线程轮流切换分配时间片来执行的。为了线程切换后能恢复到正确的位置,每个线程都有单独的程序计数器。所以程序计数器就是私有的。(在程序进行分支、跳转时记录行号。这是计数器最典型的应用)
虚拟机栈--(数据结构中,堆和栈是一对)。栈与堆不同,是线程私有的。栈主要是为java的方法服务,当线程创建时,虚拟机栈会为线程分配一块内存的区域,在线程执行的过程中,调用的每个方法,都会创建一个栈针(可以将“栈针”理解为当前方法的一个引用)在栈针中用于存放,局部变量、操作栈、动态链接、方法出口等。每个方法从被调用到执行完,都对应一个栈针。在虚拟机中从入栈到出栈的过程。我们形象的可以看成我们方法在内存中的一个实例。
本地方法栈--与“虚拟机栈”类似。不同的是“虚拟机栈”是为执行java方法所提供的。而“本地方法栈”则是为执行本地方法时服务的, 也就是在调用操作系统级别的底层方法时,才会在“本地方法栈”存放方法栈针。