Java运行时内存划分

这一章主要讲解 Java程序运行时的内存划分
(写这些的目的不是为了再写一遍笔记,而是想看完书之后通过自己的回想吸收了多少知识,同时也融入一些其他的理解)

虚拟机的"虚拟"性

我们一直称呼 Java 虚拟机,既然叫虚拟机,那究竟是对什么进行虚拟呢?一种情况就是对 Java 运行时的内存区域进行划分,虚拟出几块区域,针对这几块区域实现它的管理目的,比如跨平台、 GC(垃圾回收)、类的加载等。所以说虚拟机的虚拟性在于它会将你已知的概念进行组合,用一套它自己的描述方式进行描述,但是底层还是我们学过的那些概念,下面就对这些概念进行解读

运行时内存划分由来

我们都知道 Java 是跨平台的语言,要实现跨平台就不能依赖于具体的系统和硬件,那 Java 的设计思想是什么呢?封装!在软件设计领域没有什么功能是一层封装解决不了的,如果一层不行,就再加一层。Java 也采用了这种思想,Java 针对不同的平台专门写虚拟机,而这个虚拟机保证了不同硬件之间程序运行的一致性。所以剩下的问题在于我已经实现了虚拟机,我该怎么设计去解析这个语言?

运行时内存划分

这其中的一项重要的设计就是将程序运行时的内存进行划分,不同的区域职责各不相同,好比说,我现在给你个厂房,你给我造辆汽车,那不同的部件制造肯定是在不同的区域内进行的,不可能缺什么就直接现场造一个,效率低下,好的方法直接到对应的部分取就好了。各部分合作才能效率高的完成,就像流水线一样。

Java 的内存划分也是同样的道理,我们来看一下具体的划分

// 插入图片

上图是我在网上找的,基本上所有的讲解运行时内存都逃不过这张图描述的划分。可以看到内存的划分是分线程私有和线程共享的,现在想来这是一种必然,因为多线程的存在必然需要线程私有的空间

程序计数器

程序计数器就是代码运行行指示器,但这种说法并不准确,但是很形象,你可以理解为行指示器,指示代码运行到哪一行。实际上, Java 代码被编译成字节码,一行代码可能有多条字节码,这里程序计数器应该指向的是编译后字节码。

Java 虚拟机栈

这个栈的概念和 C 语言中的栈的概念很类似,这也是 Java 方法执行的内存模型,每执行一个方法就会创建一个栈帧,每个栈帧就对应着一个方法,栈帧里面存放着局部变量表(你传入的参数以及方法内创建的局部变量)、操作数栈(这个以后会讲到,现在不明白没关系)、动态链接信息以及返回地址等信息,现在不需要讲的太多,这些到了该讲的地方一定会深入的讲解,过早的讲解不相关的知识会被绕晕,现在只需要记住这是执行方法的地方即可。

本地方法栈

和 Java 虚拟机栈类似,只不过 Java 虚拟机栈执行的是 Java 方法,而本地方法栈执行的是本地方法

相信这是读者听到的最多的概念,也是最神秘的区域,经常听到别人说垃圾回收,对象在堆上创建,堆空间溢出等等专业名词,但是不知道堆是什么样的。其实一句话,堆就是用来分配对象实例的

什么?就一句话,逗我吗。。。其实所有的问题都是基于这句话产生的,由于堆用来分配对象实例,那自然而然的当分配的对象越来越多,堆空间不够用了,当再次发生对象分配的时候也就产生了所谓的堆内存溢出。由于 Java 是提供垃圾回收的,那么虚拟机就需要对堆空间进行回收,对于那些不再使用的对象,我们需要将他们的空间进行回收,回收的内容主要就是堆空间,这也就是垃圾回收的由来。所以说,堆并不神秘,使用的仍然是系统的堆的概念,只不过虚拟机对它划分过来的堆空间提供了管理的功能。

方法区

方法区,听着和方法有什么区别呢?我们说 Java 是一门面向对象的编程语言,我们创建类,在类中创建实例域和方法,那么当我调用一个方法的时候,这个方法需要操作数据,操作的数据大概率就是本类的实例数据,而且该方法大概率是通过类实例化一个对象进行调用。一个方法的调用涉及的内容很多,这些信息是否需要保存下来呢?方法区就是保存着方法运行的诸多信息,包括虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,这些内容随着对虚拟的学习也会更加的深入。

方法区中有块区域叫做常量池,听着应该像保存常量的地方,八九不离十,长常量池存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

总结

一个 Java 运行时的内存划分大概就是上述所示,里面同时提到了很多新的概念,比如类信息、字面量、符号引用等,可能让人摸不清楚,这些概念随着后续的学习都会明白的。应该将重点方法内存划分的区域,以及各个区域的作用。

参考周志明《深入理解Java虚拟机》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值