文档章节

JVM-----java内存区域与java内存模型

Carol998
 Carol998
发布于 02/22 19:10
字数 1637
阅读 17
收藏 12

一.java内存区域

jvm在执行java程序的过程中会把所管理的内存分为若干不同的区域,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁的。

以下是java运行时内存区域图:

1.程序计数器

  程序计数器是一块较小的区域,它可以看做是当前所执行的字节码的行号指示器。在java的多线程交互执行的过程中,被中断的线程当前执行到那条指令的内存地址需要被保存下来,以便于该中断线程恢复执行的时候可以按照被中断时的指令继续执行下去。

  为了能使每个线程切换后都能恢复到正确的位置,因此每一个线程都是需要有自己的程序计数器。每个线程独立存储,互不影响,因此我们成这个内存为“线程私有”的内存。

2.java虚拟机栈

  每当创建一个线程,jvm就会为该线程创建一个java虚拟机栈,虚拟机栈的生命周期与线程相同,它随线程的创建与结束而启动和销毁的。该线程每调用一个方法,jvm就会在该虚拟机栈中创建一个栈帧,用于存放局部变量表,操作数栈,接口信息等。每一个方法的从调用到完成的过程就对应一个栈帧在虚拟机栈中的入栈以及出栈的过程。正在执行的方法的栈帧位于栈顶。

  虚拟机栈的这个内存区域为"线程私有"的内存。

  该区域可抛出两种异常情况:

  • StackOverflowError异常:线程请求的栈的深度大于了虚拟机所允许的深度。
  • OutOfMemoryError异常:虚拟机栈东塔扩展时无法申请到足够长度。

 

3.本地方法栈

   本地方法栈和Java栈所发挥的作用非常相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行Native方法服务。 本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

   本地方法栈的这个内存区域为"线程私有"的内存

4.java堆

  堆是JVM所管理的内存中国最大的一块,是被所有Java线程锁共享的,不是线程安全的,在JVM启动时创建。堆是存储Java对象的地方,这一点Java虚拟机规范中描述是:所有的对象实例以及数组都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代再细致一点有Eden空间、From Survivor空间、To Survivor空间等。

5.方法区

  方法区用于存储已被虚拟机加载的类信息,常量,静态变量即编译后的代码以及数据

  在方法区中存在一部分内存称为“运行时常量区”,用于存放编译器生成的各种字面量以及符号引用量。【其中,字面量就是指final变量等;引用变量包括类和接口的全限定名,字段名称,方法名和描述符】

  方法区为java线程共享

  当方法区无法满足内存需求的时候,将抛出OutOfMemoryError异常。

 

二.java内存模型

 1. java内存模型(java Memory Model , JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了java程序在各种平台下对内存访问都能保证一致的机制及规范

 2. Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

如:线程1 要与 线程2 进行数据交换,首先,线程1要把自己工作内存1中的数据更新保存到主内存中,然后线程2要去主内存中拷贝一份数据,刷新到自己的工作线程2之中。

3.java内存模型是围绕着并发编程中的原子性,可见性,有序性这三个特征来建立的。

  • 原子性:一个操作要么不执行,要么全部执行完毕,不能被打断。
  • 可见性:一个线程对共享变量做了修改之后,其他的线程立即能够看到该变量的变化。
  • 有序性:在本线程内观察,所有的操作都是无序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义”,后半句是指“指令重排”现象以及“工作内存与主内存同步延迟”现象。

4.总结:JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性

注:主内存和工作内存与JVM内存结构中的Java堆、栈、方法区等并不是同一个层次的内存划分,无法直接类比。

 

关于java内存模型的详细讲解:

https://blog.csdn.net/gupao123456/article/details/81221641

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
Carol998
粉丝 3
博文 13
码字总数 11579
作品 0
绵阳
私信 提问
加载中

评论(2)

Carol998
Carol998

引用来自“CHINAing”的评论

这段时间能记得住,但是不理解啊。还会忘
因为我是最近在看《深入理解java虚拟机》,然后也有去看一些关于这个博客文章,这是按照我自己的理解来总结,可能我写不是很清楚,也不全面。你可以去看看书或者其他文章,看写别人是怎么理解,说不定能给你一些新的思路。嘻嘻
CHINAing
CHINAing
这段时间能记得住,但是不理解啊。还会忘
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体...

王磊的博客
01/14
0
0
JVM系列(二)—JVM内存结构

所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些...

haoyuehong
2018/12/29
0
0
Java并发(1)- 聊聊Java内存模型

引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距。为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来...

knock_小新
2018/07/18
0
0
Tomcat中JAVA JVM内存介绍、内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
2018/07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RadosClient OSDC

RadosClient.h class librados::RadosClient : public Dispatcher//继承自Dispatcher(消息分发类){public: using Dispatcher::cct; md_config_t *conf;//配置文件private: ......

banwh
49分钟前
1
0
如果让你写一个消息队列,该如何进行架构设计?

面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做过较为深入的原理的了解,或者...

李红欧巴
今天
5
0
错题

无知的小狼
今天
2
0
PowerShell因为在此系统中禁止执行脚本的解决方法

参考:window系统包管理工具--chocolatey 报错提示: & : 无法加载文件 C:\Users\liuzidong\AppData\Local\Temp\chocolatey\chocInstall\tools\chocolateyInstall.ps1,因为在此系统上禁止运...

近在咫尺远在天涯
今天
3
0
TP5 跨域请求处理

https://blog.csdn.net/a593706205/article/details/81774987 https://blog.csdn.net/wyk9916/article/details/82315700...

15834278076
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部