java内存模型

本来已经有很多文章了,但感觉大多文章不太清晰,固写了此文。

参考《深入理解java虚拟机》

在网上找了好多内存模型图,以下仁兄的图还不错(和书上的一样,理解起来清晰明了),如有冒犯,请联系我删除。

https://www.jianshu.com/p/d391b3c68a77

上图

 

方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。是所有线程共有的。相关jvm参数permSize这类就是设定这块内存。java 8 以后对应的是metaSpace 这块内存。可能会出现OOM之类error。

就是常说的堆内存,对象引用所指向的内存。比如new 了一个Student() 类,实例指向的就是这个堆内存,被所有线程共享。当内存不够用时会出现OOM之类error,gc也是在此块内存中发生。

堆内存又会被具体化分,大致分新生代和老年代,可以参考(http://www.cnblogs.com/yydcdut/p/3959711.html)理解一下。相关jvm 参数 xms,xmx就是设定这块内存的分配。

虚拟机栈

某一个线程独享。就是某一个线程一次完整的调用链,生命周期和线程一样。debug的时候会有一个调用链(栈)就是这块。存放了调用关系,方法中的属性等信息。stackOverFlow 就是出现在这里,只要超过了栈深度就会出现,比如不适当的递归就会造成此问题。

栈深度是动态调整的,原理不详。

本地方法栈

某一个线程独享。和虚拟机栈类似,只是调用的是本地方法(native method)。

栈逻辑上划分为虚拟机栈和本地方法栈,但不同jvm实现可能不同。

程序计数器

某一个线程独享。当前线程所执行的字节码文件的行号指示。就是debug时,代码执行到哪一行,靠的就是这个实现的。

 

posted on 2018-05-24 15:49  cococooder  阅读(129)  评论(0)    收藏  举报