java内存模型之运行时内存区域

 2019-12-10 16:12  阅读(1056)
文章分类:Java Core

20191210001648\_1.png

2.2.1 程序计数器(线程私有)

可以看作当前线程所执行的字节码的行号指示器,每个线程都有一个独立的程序计数器。

2.2.2 虚拟机栈(线程私有)

或者说是虚拟机栈中局部变量表,存放了各种基本数据类型(boolean,long,short等),对象引用和returnAddress

其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余类型只占1个。

局部变量表所需=内存空间在编译期间完成分配。所以每个方法分配的局部变量空间是确定的且不可改变。

2.2.3 本地方法栈

和虚拟机栈发挥的作用非常相似,区别在于虚拟机栈执行的是java方法服务,而本地方法栈执行的是虚拟机使用到的native方法服务

2.2.4 Java堆(所有线程共享)

是虚拟机所管理的内存中最大的一块。唯一目的就是存放对象实例。

也是垃圾收集器管理的主要区域。也被称为GC堆。可以细致的划分为:新生代和老年代。再细致一点有Eden空间,From Survivor空间,To survivor空间等。可能划分出多个线程私有的分配缓冲区(TLAB)。

可以通过-xms-xmx调整大小

2.2.5 方法区(所有线程共享)

用于存储虚拟机加载的类信息,常量,静态变量,即使编译后的代码等数据。在hotspot虚拟机上开发部署的开发者来说,更愿意把方法区称为“永久代”,本质上两者并不等价。仅仅是因为hotspot虚拟机设计团队把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已。这样hotspot就可以像管理java堆一样管理(这部分内存)方法区。调整大小:-XX:MaxPermSize

2.2.6 运行常量池(方法区的一部分)

用于存放编译生成的各种字面量和符号引用。并非预置入Class文件中常量池的内容才能进入方法区运行时的常量池,运行时有可能将新的常量放入池中,比如String.intern()方法

2.2.7 直接内存(不是数据区的一部分,也不是**java**虚拟机规范中定义的内存区域)

在java1.4新加入NIO(New Imput/Output)类,引入了一种基于通道(Channel)和缓冲区(Buffer)的I/O方式,他可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免了Java堆和Native堆的来回复制数据,显著提高性能。

直接内存不受到java堆大小限制。

以上内容出自《深入理解Java虚拟机 JVM高级特性与最佳实践》

根据跟人理解,精简了一下帮助大家更好的理解java内存模型。

有问题及时提出。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java内存模型之运行时内存区域

相关推荐