一、JAVA运行时,内存区域主要划分为5部分: 方法区、堆、虚拟机栈、本地方法栈、程序计数器,如图:
2、堆: 属于线程共享的内存区域,用于存放对象实例。同时Java 堆是垃圾收集器管理的主要区域。 堆可以分为:新生代、老年代,新生代又可以划分为:1个Eden(伊甸)区和2个Survivor(幸存)区(From Survivor、To Survivor); 新创建的对象在Eden区, 当经过一次Minor GC(年轻代内存清理),存活的对象被移动到From Survivor区, 第二次Eden区进行Minor GC时候,From Survivor区的对象和Eden区的对象被移动到To Survivor,如此循环往复。 对象的复制次数达到16次,该对象就会被送到老年代中。
Minor GC:清理新生代
Major GC:清理老年代
Full GC:清理整个堆区。
3、虚拟机栈: 属于线程私有的数据区域,与线程同时创建,总数与线程关联,代表Java方法执行的内存模型。 每个方法执行时都会创建一个栈桢来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。 每个方法从调用直结束就对于一个栈桢在虚拟机栈中的入栈和出栈过程。
4、本地方法栈: 属于线程私有的数据区域,为虚拟机使用到的Native方法服务
5、程序计数器: 属于线程私有的数据区域,是一小块内存空间,主要代表当前线程所执行的字节码行号指示器。字节码解释器工作时, 通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。