快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!
现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多失去了耐心去阅读那些长文干货,大多数时候我们希望剪短的阅读,就可以get到一个知识点,为此,我将做以下改版:
- 公众号内容化繁为简,力求不说废话,分为两个模块:
- “小白带你快速了解”–这个版块会带你快速了解要说的这个知识点,如果你此前不了解,简短的几行文字可以带你快速了解这个知识点,如果你此前知道这个知识点,那么这简短的几行文字可以带你快速复习巩固一遍!
- “庆哥陪你深入分析”–这个版块将会对上述知识点进行更深一步的分析,目的就是不仅让你知其然还要知其所以然,力求让你对这个知识点了解的更加透彻
- 两个版块的特点:
- “小白带你快速了解”会以最短的文字说明解释这个知识点,让你知道是什么,如何用!也就是what以及how!
- “庆哥陪你深入分析”这个就会力求尽可能的把问题给你说明白,也就是所谓的why!
今天的文章就会按照这个形式,大家先来感受下!
庆哥有话说:
JVM这块知识绝对是学习java过程中的重点和难点,我习惯把这块的知识叫做javaSE高级基础,在学习jvm这块的知识,你一定会遇到几个概念,那就是java内存结构,java内存模型,java对象模型和jvm内存结构!而这几个概念是很多人搞不清楚的,了解了这几个概念,将对你学习jvm很有帮助!
小白带你快速了解!
我们将要了解以下几个概念:
- java内存结构
- java内存模型
- java对象模型
- jvm内存结构
什么是JVM内存结构:下面这张图就是jvm的内存结构
可以看到就是我们平常说的堆栈什么的!然后下面还有一个更加详细的图:
这就是jvm内存结构了,那什么是java内存结构呢?
记住了:jvm内存结构 = java内存结构
什么又是java内存模型呢?
先看一张图:
记住java内存模型是与多线程相关,也叫作共享内存模型,如果被问什么是java内存模型可以这样回答:
Java内存模型简称jmm,它定义了一个线程对另一个线程是可见的,另外就是共享变量的概念,因为Java内存模型又叫做共享内存模型,也就是多个线程会同时访问一个变量,这个变量又叫做共享变量,共享变量是存放在主内存中的,而且每一个线程都有自己的本地私有内存,如果有多个线程同时去访问一个变量的时候,可能出现的情况就是一个线程的本地内存中的数据没有及时刷新到主内存中,从而出现线程的安全问题。
比较难理解的java对象模型,推荐一篇博客,阿里大牛写的:
深入理解多线程(二)—— Java的对象模型
以上由小白带大家快速的看一下这几个概念,相信你对这几个易混淆的概念有了初步的认识,如果你还想继续深入的了解和学习,请继续往下看。
庆哥陪你深入分析
我之前一直不理解的就是这个java内存结构和jvn内存结构到底什么关系,只到有一天我在一个博客中看到这么一句话。
也就是说java内存结构和jvm内存结构是一样的!
所以我们就拿jvm内存结构来说,这个是jvm内存结构图
从这个图中来看,这个java内存结构和jvm内存结构也就是我们平常经常说的堆内存,栈啊,方法区什么的,对,就是这个,以后再说起这个我们就知道是在说java内存结构(jvm内存结构了),那么我们要了解的也就是什么是堆内存啊,什么栈内存啊,什么又是方法区啊,这个我们今天就不详细说了,我们今天只要明白什么是java内存结构也即jvm内存结构是什么就行了,关于其本身的一些知识,由我们经常听说这几个名词就可知他们是非常重要的知识点,所以这个会单独拿出来讲的!
下面咱们来说说什么是java的内存模型,这个和java内存结构从字面意思上看真的很相似,但是实际上,这两者相差不小,要谈java的内存模型,那么这张图就是必不可少的。
这就是java内存模型结构图了,我们从图中就可以直观的看到java内存模型是与多线程相关的,其中也提到了共享变量。
Java 内存模型简称 JMM,它定义了一个线程对另一个线程是可见的,另外就是共享变量的概念,因为 Java 内存模型又叫做共享内存模型,也就是多个线程会同时访问一个变量,这个变量又叫做共享变量,共享变量是存放在主内存中的,而且每一个线程都有自己的本地私有内存,如果有多个线程同时去访问一个变量的时候,可能出现的情况就是一个线程的本地内存中的数据没有及时刷新到主内存中,从而出现线程的安全问题。在 Java 当中,共享变量是存放在堆内存中的,而对于局部变量等是不会在线程之间共享的,他们不会有内存可见性问题,当然就不会受到内存模型的影响。
那么如果我们被别人问到什么是java内存模型的时候我们该怎么回答呢?这个你最好把这个图简单的画一下,最不济也要说下这个java内存模型抽象示意图,然后就想上面提到的你可以这么回答:
Java内存模型简称jmm,它定义了一个线程对另一个线程是可见的,另外就是共享变量的概念,因为Java内存模型又叫做共享内存模型,也就是多个线程会同时访问一个变量,这个变量又叫做共享变量,共享变量是存放在主内存中的,而且每一个线程都有自己的本地私有内存,如果有多个线程同时去访问一个变量的时候,可能出现的情况就是一个线程的本地内存中的数据没有及时刷新到主内存中,从而出现线程的安全问题。
接下来我们再来简单的看下这个java内存模型示意图:从这张图我们可以看出,线程之间的通信是受jmm控制的,我们就这张图来说,线程A和线程B如何才能进行通信,假如线程A先执行,它会拿到共享变量,然后进行操作产生共享变量的副本,紧接着将本地内存中的共享变量副本刷新到主内存中,这时共享变量也就得到的更新,同理线程B 再去操作共享变量就达到了线程A和线程B之间的通信了。
基本上到这里你就知道了什么是java内存模型了,那其实关于到具体的应用当中,java内存模型还有很多内容,比如重排序,volatile关键字和锁等,这其实也牵涉到多线程了,因为本身java内存模型就是多线程相关的,所以在学习java多线程这快知识的时候,很多地方都是要借助这个java内存模型的!
在java中,我个人认为jvm,多线程以及并发编程,这三者是紧密相连的!我们以后慢慢来说。
在这几个易混淆的概念中,我觉得最不好理解的一个就是java对象模型,说实话这个java对象模型我问过一些人,基本上都不知道,我个人现在对它理解的也不是很透彻,为了避免误导大家,我在网上选取一篇大神的文章供你们参考学习,你们可以看看,这java对象模型是否不容易理解!
以上就是对这几个概念的分析解读了,希望对你有用,当然,非常希望你能提出宝贵意见以及指出文章所说不当之处,万分感激!
题外话
也许长时间关注我的老读者知道,我从刚开始的《一个自学的程序员》改名到现在的《Java从0到1》,又不断的摸索行文风格,之前的技术对话形式,可以看到今天的文章又是不同,因为我发现之前的技术对话形式,有点过于啰嗦!
一个不可否认的现实就是现在基本上很少有人能够耐心读完一篇文章了,更别说是枯燥无味的技术文章了,为此,我征求大家意见,撤掉以前过于啰嗦的技术对话形式,改成了现在这个样子,大致有这么两大板块:
- “小白带你快速了解”这个板块我力求不说废话,以最少的文字为你解读要说的知识点,基本上能让你快速了解这个知识点,是什么以及如何用!
- “庆哥陪你深入分析”这个板块我会尽可能的给大家详细的说明这个知识点,目的是让你不仅知其然还要知其所以然!
如果你时间紧,想快速get到技术点,那么“小白带你快速了解”很适合你,如果你想更加深入的学习,那么“庆哥陪你深入分析”!
我为什么要这样做?我记得之前说过,我从最开始的8个人的关注到现在的快2000关注,虽然关注量依然微不足道,但是这都是我一步步积累来的,基本上都是认可我的,说实话我很满足,所以我很珍惜,我不仅会花心思去写高质量文章,我还会想如何写文章更适合大家,如何行文能给大家带来最大的价值,就是不想辜负每一位认可我的人!
之前读三表的文章,一句话真的戳中了我,那就是“哪有开挂的人生,只不过是有贵人相助!”,后来有一位前辈给我说“那也是你值得相助”,是啊,我能怎么办,唯有踏踏实实,做好自己,努力输出,不辜负你们每一个人,我相信会有越来越多的人认可,说不定哪天就遇到了我的贵人。。。
说的有点多了,见谅,下面送出一本书
这次咱们也俗一点,就根据留言点赞量来获取这本书吧,但是也不能太俗,在我这里就是要不一样,注意了,留言点赞第二高的朋友获赠此书!请注意,不是留言点赞最高,是第二位的,如果有相同的,那么咱们抢红包决定!就这样!
如果这篇文章多多少少得到了你的认可,还请帮忙转发分享一波!谢谢各位!