JVM内存模型详解

什么是JVM内存区域分区

事实上,这个问题很简单。当JVM运行我们编写的代码时,它必须使用多个内存空间、不同的内存空间来放置不同的数据,然后与我们编写的代码流协作,这样我们的系统才能运行。

例如,我们现在知道JVM将类加载到内存中以进行后续操作。所以我问你,这些类在被加载到内存之后会去哪里?你想过这个问题吗?

所以在JVM中必须有一个内存区域来存储我们编写的类。

包括我们定义的成员变量、类变量、方法、局部变量等,都对应于JVM内存中记录存储的一块内存。

方法区

在以前的JDK1.8版本中,它代表了JVM的一个区域。在1.8版之后,这个区域的名称被改为“MateSpace”,可以称为“元数据空间”。当然,它主要存储关于我们自己编写的各种类的信息。

例如。有两个类,user1类没有成员变量,user2类有实名类变量。

public class User1 {
	private String userName = "wangwu";
}
public class User2 {
	private static String realName = "zhangsan";
	private String userName = "lisi";
}

当这两个类被加载到JVM中时,它们被存储在方法区域中(类的所有类变量都被分配)。下图:

程序计数器(执行代码指令)

我们知道加载到JVM中的类对象是。我们在之后编写的类文件。编译了Java文件。

编译后,我们的代码将被编译成计算机能理解的字节代码。还有这个。calss文件是我们的代码编译的字节码。

当加载到内存中时,字节码执行引擎开始工作。为了执行我们编译的代码指令,问题出现了。我们是否需要一个内存空间来记录字节码执行引擎当前执行的位置?这个特殊的存储区域是程序计数器,用来记录当前执行的字节码指令的位置。

注:在多线程环境下并发执行时,计算器的CPU是确定的。当CPU从线程1切换到线程2,然后又切换回线程1时,您想知道线程1将采取哪个步骤吗?这是程序计数器的功能。因此,当一个线程再次将其上下文切换到前一个代码时,它需要一个特殊的记录,记录当前线程已经执行了哪个字节码。所以每个线程都有自己的程序计数器。 

栈空间,也成为Java虚拟机栈

当一个线程执行一个方法时,如果该方法有一个局部变量,那么就需要一个区域来存储该局部变量的数据信息。这个区域被称为Java虚拟机栈。

每个线程都有自己的Java虚拟机栈。例如,在执行主方法时,主线程用于存储在主方法中定义的局部变量。

例如,在上面的main()方法中,实际上有一个名为“user1”的局部变量,它引用了user1的一个实例对象和一个名为“i”的局部变量。下图显示:

因为它是一个堆栈,所以遵循“先进先出”的原则。当方法被执行时,堆栈帧将从堆栈中出来,局部变量信息将从内存中删除。所以局部变量是线程安全的。因为只有当前线程才能获得这个值。

问:为什么要使用后进先出的数据结构?

答:假设方法A调用方法B,首先对方法A的堆栈进行叠加,然后对方法B进行叠加。方法B执行后,方法B的堆栈帧首先退出堆栈,然后继续执行方法A,然后方法A的堆栈帧退出堆栈。所以使用后进先出的堆栈结构是完美的。 

堆空间

或者上面的代码。当主线程执行main()方法时,它首先在堆内存中实例化user1对象,然后在局部变量中创建user1。user1存储实例化的user1对象的内存地址。然后执行学生对象的getname()方法。

如下:

堆外内存

实际上,在JDK的许多底层代码API中,比如NIO。

如果您查看源代码,您会发现,在许多地方,代码不是由Java编写的,而是通过使用本机方法调用本地操作系统中的一些方法,这些方法可以用C语言编写。

例如: 

public native int hashCode();

public final native boolean compareAndSwapInt(Object paramObject, long paramLong, int paramInt1, int paramInt2);

当调用这个本地方法时,将有一个对应于线程的本地方法栈,它实际上类似于Java虚拟机栈。它还存储各种本地方法的局部变量表等信息。

另一个区域,JVM或NOT,可以通过NIO中的AdLoad直接API在JVA堆外分配内存空间,然后使用Java虚拟机栈中的DirectByteBuffer来引用和操作堆内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员-张凯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值