在阅读《深入理解java虚拟机--周志明》时,第二章没有十分清楚的解释新生代,老年代,永久代的详细概念。通过网上浏览,渐渐梳理清晰了。
java的内存模型,分别为
【堆,方法区(非堆)】→ 线程共享
【虚拟机栈,本地方法栈,程序计数器】→线程隔离
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
程序计数器,记录线程执行位置
虚拟机栈,java方法调用时会创建一个栈帧(其中有局部变量表,由此得出方法的局部变量(如基本类型,对象引用等)是创建在栈中的)
本地方法栈,与虚拟机栈类似,不同的是为Native方法(书中没有介绍什么是Native方法,简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java堆,存放对象实例和数组
方法区,存储加载的类信息、常量、静态变量、编译后代码
--运行时常量池(在方法区中),保存class符号引用以及直接引用
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java堆分成Eden,Survivor,Old
方法区在JDK7中分为PermGen(永久代),CodeCache,而在JDK8中,取消了永久代的概念,变成了元空间MetaSpace。
用Jcosole或者Jvisualvm可以看出来