JVM是java知识体系的基石之一,任何一个java程序的运行,都要借助于他。或许对于我这种初级程序员而言,工作中很少有必要刻意去关注JVM,然而如果能对这块知识有所了解,就能够更清晰的明白程序的运行机制,从而写出更为健壮的代码,也能更好的理解java中很多处理方式的原因。以下是个人读书后整理的知识点,同时参考并引用了以下博客:
一、JVM内存模型
JVM典型的内存模型如下图:
程序计数器 |
线程私有 | 学过组成原理的对这个一定很亲切,这里相当于JVM版的,作用是当前线程所执行的字节码的行号指示器,通俗讲就是记录当前正在执行字节码的位置,以便解释器能获取下一行字节码。 |
虚拟机栈 |
线程私有 |
用于存储局部变量表(包括参数)、操作数栈、方法出口等信息,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据,代表了处理逻辑 |
堆 | 线程共享 |
存放了对象实例及数组(所有new的对象),也是我们做GC处理的最为关注的一部分内存区域,堆解决的是数据存储的问题,即数据怎么放、放在哪儿,代表了数据 |
方法区 | 线程共享 |
存储虚拟机加载的类信息、常量、静态变量,在分代回收中也可认为永久代(不同虚拟机实现不同,这里只是为了方便理解) |
本地方法栈 | 线程私有 |
作用与虚拟机栈类似,但是调用方法都为Native本地方法,如调用C的DLL库方法等 |
直接内存 | 线程共享 |
这部分内存并不在JVM内存分区之内,主要是调用Native方法分配的内存,由于这些方法不是有JVM执行的,其内存也不归JVM管理 |
可以看到该部分分为三大块:年轻代(young generation),年老代(old generation)和持久代(permanent
generation),其中年轻代分成三个区域,其中一个是Eden区,另外的两个From和To都是Survivor区(From和To只是为了说明,两者实质上一样,方向可互换)。现在我们来看一个对象简单的处理过程(图解参考):
JVM内存模型介绍完毕,如有错误,望不吝指教。下一篇计划整理JVM垃圾回收算法部分。
原文:http://www.cnblogs.com/good-temper/p/3576259.html