JVM内存模型

1.运行时的内存管理

这张图是我在我的书上拍下来的

可以看出来内存区域分为线程公用的和线程私有的。

1.方法区

有时候有可以称为永久代,这部分主要存储的是类加载时的类的信息,常量静态变量以及编译的字节码等信息。常量池就在方法区里面,在类加载的时候有些常量就已经确定,还有的常量需要在运行的时候确定,这部分就称为运行时常量池,同样是作为常量池的一部分。这部分是可扩展的,可以通过启动自定义参数 -XX:max perm size来实现大小控制。

2.堆

这部分主要存储的就是具体的实例对象,也是内存回收的主要区域。这部分还以细分为新生代和年老代。更细分还可以分为eden区和survivor区。这部分属于GC的知识点,我以后也会进行介绍。这部分同样是可以扩展的,下面四个参数可以实现扩展

-xmn堆里面年轻代的大小
-xmx堆内存的最大大小
-xmsJVM启动时直接分配的堆内存的大小
-xss每个线程对应的堆内存的大小

3.虚拟机栈

虚拟机栈是程序运行时的内存模型。每次程序运行一个方法的时候,都会创建栈帧这样的存储单元,他存储的是方法运行期间的局部变量表和方法的入口和出口等信息。这部分时线程私有的。局部变量表存储的就是方法的局部变量,包括八大基本数据类型和引用数据类型。引用数据类型就是指向堆里面对象的指针。

4.本地方法栈

这部分和虚拟机栈同样是执行方法的,但是和虚拟机栈不同的是本地方法栈是直接调用JNI  native方法的。

5.程序计数器

逻辑上来说,虚拟机执行程序代码需要记录程序执行的位置,然后根据位置来判断下步是执行那行那个位置的代码。程序技术器主要是跟虚拟机栈联系,他记录的就是程序在当前线程运行的方法的位置。这样在线程切换的情况下下才会保证线程可以继续正确的执行。当执行本地方法栈里面的方法的时候,程序计数器的值为0。

6.直接内存

还有一部分,图里面没有画出来,但是书上有介绍。我就打出来。

直接内存:直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范里面定义的内存区域。是因为JDK1.4新加入了NIO,引入了一种基于通道与缓冲区的IO方式,他可以使用native函数库直接分配堆外内存。然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样因为避免了在java堆和Native堆之前来回复制数据而显著提高了性能。

之前我也看过很多网上文章,有些讲得很细。但是我就是看不懂,后来看了这本书的介绍,才感觉稍微理解了内存模型,希望可以帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值