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) 收藏 举报
浙公网安备 33010602011771号