堆栈 jvm 太难懂?买房子总能理解了吧

堆栈 jvm 太难懂?买房子总能理解了吧

求关注哦~~


java零基础入门-面向对象篇(一) 基础类型和引用类型

友情提示:本章开始可能会有部分较深入的内容,不说又不行,说了又很难解释清楚,因为里面的技术细节实在太多太复杂,所以我会屏蔽部分技术细节,只展示当前需要了解的基础知识,避免出现讲了半天还是没人懂的情况。随着我们的知识增长,后面会逐步的将细节补充完整。

学习编程,一定要把思路放开,不能太局限,多多进行思维能力的锻炼才能提高自己的内功。比如我们很常见的买房啊,哪里修商场啊,其实跟我们的内存结构是很类似的。他们都涉及到一个资源规划的问题,来吧,一起来锻炼下思维能力吧。

最近全国除了最火的抢人大战,其实前段时间还有一个东西很火,那就是城市规划。比如我们的首都北京,选择了雄安进行首都功能疏解,其实很多城市都有类似的规划,比如天津滨海新区,深圳前海新区等等。政府设立了一个即将开发的新区后,会干嘛?招商引资,首先是大的企业进来修路盖高楼大厦,然后修住宅,再卖给老百姓。我们来看看具体过程。

首先,政府画了一个圈,“走过路过不要错过哈,新鲜出炉的地块,各种优惠政策,减税减税再减税,快来看看啊~”,然后一堆大企业蜂拥而上,“给我留一块~”,“我也要~”。然后各种大企业开始修办公楼啊,房地产开发商开始修海景房啊,然后轮到地产开发商要喝了,“走过路过不要错过啊,海景房值得拥有,机不可失,抢到了幸福生活,没抢到继续干活~”。然后轮到抢房大军蜂拥而上了。

堆栈 jvm 太难懂?买房子总能理解了吧

给我房!!!

再来看看电脑内存,其实我们的电脑就是政府部门,每一次一开机,就开始要喝,“内存开始大派送啦,需要的快来领啊”,然后各种开机启动的应用程序开始抢内存,什么聊天的啊,杀毒的啊,浏览器啊,当然还有系统自带的功能,统统需要内存。当然,内存不是一开机就分完了的,还有很多是我们启动了新的应用程序才会划分内存给你,比如我们的java。

堆栈 jvm 太难懂?买房子总能理解了吧

应用程序和系统程序占用内存

电脑开机进行的内存免费大派送跟我们的政府规划很像,在座的各位都是大佬,内存要多少有多少。然后我们打开java的时候,java也成功的分到了一块内存空间。java这个房地产商跟别的有点区别,他很牛,拿的地很大,他要自己规划自己的地,也就是说它不仅仅要做房地产,他还要修商场,建公园,这个就厉害了~

堆栈 jvm 太难懂?买房子总能理解了吧

java虚拟机

看见没有,系统给了一块内存java ,然后他在自己的一亩三分地上,开始干自己的规划了,这是个很高级的房产开发商。java有个名词叫java虚拟机(JVM),你就可以理解为他是一个虚拟的系统,他干了很多和系统类似的活,系统把内存交给java以后,就由 jvm 来负责规划内存。就像我们上面说的,政府部门划了地给开发商,java自己也划地分给他下面的小弟。那么java里面的小弟又是啥?继续往下看

首先我们看看普通人眼里的内存,他就是一块绿色的板子,上面有很多电路,下面有一条金光闪闪的东西,好了,理解完了。

堆栈 jvm 太难懂?买房子总能理解了吧

普通人看内存

再来看看硬件工程师眼里的内存,他就是各种电路啊,电容啊,门啊之类的东西,其实我也不是很懂,大概是这样。

堆栈 jvm 太难懂?买房子总能理解了吧

硬件工程师看内存

接下来看软件工程师眼里的内存,这个图是指分给java的内存,也就是jvm管理的内存。我们只看java这个开发商,自己已经分到的内存,其他软件,系统占用的内存我们不去管他。我们看到 jvm 划分的内存大概有以下这么几个区域:本地方法栈,虚拟机栈,程序计数器,堆,方法区,这些就是 java 自己的小弟了。

堆栈 jvm 太难懂?买房子总能理解了吧

jvm内存

我们看看这些颜色是咋回事,和上面的规划图颜色说明差不多,红色的是 堆,可以理解成商业用地,绿色的是方法区,可以理解成公园,这两个区域的特点是,他们是公共用地,不管哪个小区的居民,都可以来压压马路,看看风景。再看上面的,本地方法栈和程序计数器是灰色,你可以理解为市政设施,每个片区都有警察局,有困难找警察叔叔,我们姑且不去管他,知道就行了。主要看看 虚拟机栈,这个下面简称为栈,这个很重要。我们可以理解成居民小区,每个人只能出入自己的小区,去别人小区可不行,保安不让进。

所以总结一下,堆和方法区是公共的,每个小区的居民都可以去玩,而栈是私有的,不能随便串门的。这个理解到这里就行了。接下来我们讲讲最重要的 栈 和 堆,方法区就是个大草地,暂时不用管他。

基础类型 和 引用类型

我们首先明确一个观念,我们的数据都是存在内存里的,但是不同的数据,在内存中存放的区域是不同的。有的数据存放在栈,有的数据存放在堆。具体谁放在哪,我们首先要明确数据的类型。

基础类型(又叫值类型):我前面讲的都是基础类型,byte,short,int,long,float,double,boolean,char,基础类型全部存在栈里面。

引用类型:数组,类,接口,引用类型变量存在栈,对象存在堆,通过引用确定关系。

基础类型比较好理解,创建的时候往栈里面一丢,搞定,打完收工。而引用类型就比较复杂了,引用类型的变量就是引用,啥叫引用?来吧,话不多,懵的时候就上图

堆栈 jvm 太难懂?买房子总能理解了吧

内存地址

好吧,肯定有同学又要问,内存地址又是个啥?

堆栈 jvm 太难懂?买房子总能理解了吧

内存地址

地址就是找人找东西时候用的,内存地址就是让内存划分的空间有个标记,我通过这个标记可以找到内存。所以引用类型里面存的不是你定义给他的值,而是存的内存地址。那我定义的数组啊,数组跑哪去了?它在堆里面,而这个栈里面存的地址就是堆里面放的那个数组的地址。又懵了?图图图~

堆栈 jvm 太难懂?买房子总能理解了吧

地址

我们将红色箭头干的事,叫做:引用变量指向内存。堆里面的数据,只有当有引用变量指向它的时候,才能存在,如果没人指向堆里面的数据了,就会有一位亲切的清洁工阿姨把他当垃圾处理掉。所以栈里面的变量,红色箭头,堆里面的数据这三个东西是一体的,他们不能分开。他们在一起,才是定义了一个完整的引用类型。

其实这一段对于初学者来说是有难度的,概念比较多,步骤繁琐,图也都是平面图,有没有更加通俗易懂的方式来解释这个问题呢,来吧,本教程独家三维图双手奉上。

栈是一种数据结构,他的特点就是先进后出,后进先出。只有栈顶可以操作,栈底是固定的,插入操作又叫入栈,删除叫出栈。理解这么多就可以了。

堆栈 jvm 太难懂?买房子总能理解了吧

栈结构

堆栈 jvm 太难懂?买房子总能理解了吧

入栈

堆栈 jvm 太难懂?买房子总能理解了吧

出栈

相对于栈的有序,堆是无序的,可以理解成随机划分一块空间来储存对象。

堆栈 jvm 太难懂?买房子总能理解了吧

堆是无序的

我们用三维图再来看看刚才的例子

首先是基础类型

堆栈 jvm 太难懂?买房子总能理解了吧

定义变量

堆栈 jvm 太难懂?买房子总能理解了吧

入栈

再来看引用类型

堆栈 jvm 太难懂?买房子总能理解了吧

定义变量

堆栈 jvm 太难懂?买房子总能理解了吧

开辟空间,建立引用

本篇文章为接下来的数组,类打基础,堆和栈的理解对我们更好的学面向对象很有帮助,请好好理解,多多参悟。


分享到:


相關文章: