jvm开篇-快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

 2019-12-10 16:07  阅读(1197)
文章分类:Java Core

庆哥有话说:

JVM这块知识绝对是学习java过程中的重点和难点,我习惯把这块的知识叫做javaSE高级基础,在学习jvm这块的知识,你一定会遇到几个概念,那就是java内存结构,java内存模型,java对象模型和jvm内存结构!而这几个概念是很多人搞不清楚的,了解了这几个概念,将对你学习jvm很有帮助!

小白带你快速了解!

我们将要了解以下几个概念:

  • java内存结构
  • java内存模型
  • java对象模型
  • jvm内存结构

什么是JVM内存结构:下面这张图就是jvm的内存结构

20191210001582\_1.png

可以看到就是我们平常说的堆栈什么的!然后下面还有一个更加详细的图:

20191210001582\_2.png

这就是jvm内存结构了,那什么是java内存结构呢?

记住了:jvm内存结构 = java内存结构

什么又是java内存模型呢?

先看一张图:

记住java内存模型是与多线程相关,也叫作共享内存模型,如果被问什么是java内存模型可以这样回答:

Java内存模型简称jmm,它定义了一个线程对另一个线程是可见的,另外就是共享变量的概念,因为Java内存模型又叫做共享内存模型,也就是多个线程会同时访问一个变量,这个变量又叫做共享变量,共享变量是存放在主内存中的,而且每一个线程都有自己的本地私有内存,如果有多个线程同时去访问一个变量的时候,可能出现的情况就是一个线程的本地内存中的数据没有及时刷新到主内存中,从而出现线程的安全问题。

比较难理解的java对象模型,推荐一篇博客,阿里大牛写的:
深入理解多线程(二)—— Java的对象模型

以上由小白带大家快速的看一下这几个概念,相信你对这几个易混淆的概念有了初步的认识,如果你还想继续深入的了解和学习,请继续往下看。

庆哥陪你深入分析

我之前一直不理解的就是这个java内存结构和jvn内存结构到底什么关系,只到有一天我在一个博客中看到这么一句话。

20191210001582\_3.png

也就是说java内存结构和jvm内存结构是一样的!

所以我们就拿jvm内存结构来说,这个是jvm内存结构图
20191210001582\_4.png

从这个图中来看,这个java内存结构和jvm内存结构也就是我们平常经常说的堆内存,栈啊,方法区什么的,对,就是这个,以后再说起这个我们就知道是在说java内存结构(jvm内存结构了),那么我们要了解的也就是什么是堆内存啊,什么栈内存啊,什么又是方法区啊,这个我们今天就不详细说了,我们今天只要明白什么是java内存结构也即jvm内存结构是什么就行了,关于其本身的一些知识,由我们经常听说这几个名词就可知他们是非常重要的知识点,所以这个会单独拿出来讲的!

下面咱们来说说什么是java的内存模型,这个和java内存结构从字面意思上看真的很相似,但是实际上,这两者相差不小,要谈java的内存模型,那么这张图就是必不可少的。

20191210001582\_5.png

这就是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)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> jvm开篇-快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

相关推荐