java内存模型和jvm运行时数据区对应起来谈的疑惑 5C

在java内存模型中有工作内存和主内存,主内存是所有线程共享的内存区域,
规定变量都必须存储在主内存中。但是在jvm运行时数据区中,又谈到所有局部
变量都存储在栈中,而栈又是线程私有的,对应到内存模型中就是工作内存。
相应主内存对应的就是运行时数据区的堆。这不就产生了矛盾吗?**对与局部变
量到底是按照内存模型来说存储在主内存中,还是栈中呢?**

0

7个回答

jvm内存模型和java内存模型是两回事。 java内存模型是为了解决多线程对共享数据访问保持一致性,即规定了jvm怎么协调虚拟内存和主内存关系

对于JMM与JVM本身的内存模型,参照《深入理解Java虚拟机》周志明的解释,这两者本没有关系。如果一定要勉强对应,那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域,。从更低层次上说,主内存就是物理内存,而为了获取更好的执行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为运行时主要访问—读写的是工作内存

1
qq_33240946
naget 我也看到这句话了,但不是怎么理解。不管出于什么目的,都是对内存的规划,为啥是两回事?
大约一年之前 回复

局部变量是放到jvm栈中的,全局变量应该在主内存中。

0
Pink1004
Pink1004 一个线程有一个工作内存,而又有一个主内存,由所有线程共享,如果一个变量在一个线程里定义,并且只给自己用,他就只用存在自己的工作内存,如果 还给了其他线程用了,就需要把这个变量放在主内存里来共享
大约一年之前 回复
qq_33240946
naget 意思在这儿并没有遵循jmm“所有变量都必须储存在主内存中”的规定?
大约一年之前 回复

局部变量应该存在哪?
存在主内存——多线程共享——但局部变量是线程独有的——矛盾!
存在工作内存——不符合jmm规定——矛盾!

0

一个线程有一个工作内存,而又有一个主内存,由所有线程共享,如果一个变量在一个线程里定义,并且只给自己用,他就只用存在自己的工作内存,如果
还给了其他线程用了,就需要把这个变量放在主内存里来共享

0

Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

0

所有变量,全局的和局部的都存储在主内存中,线程的私有的工作内存存有自己局部变量和全局变量的拷贝
JVM控制共享变量的值同步

0

Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JVM:运行时数据区域
概述     Java的虚拟机使Java的成为了一种跨平台的语言,Java的不直接与操作系统接触,而是通过虚拟机这个中间桥梁,通过JVM与底层接触。不同的系统有不同的JVM,但是所有的这些JVM都完美的支持Java语法,这就使得write once,run everywhere成为可能。     除此之外,JVM的内存管理机制使得不需要再为每一个新的操作去删除/免费代码,由机器代替程序员这样就...
初识JVM及jvm运行时数据区和jvm内存模型的区别
        众所周知Java从95年出世之后就一直处于语言排行榜的 top 前几位,最主要的原因是因为Java的内存管理机制,我们coding 只管new 对象(前提是正常编码)从来基本没有考虑过对象怎么存在,如何销毁释放等问题。其次就是Java 的跨平台性,准确来说应该是Java一次编译多处运行,是基于不同操作系统安装不同的Java运行所需的jvm才能完成如此强大的跨平台运行。       ...
JDK1.8 JVM运行时数据区域划分
一、JDK1.8 JVM内存模型概览 这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 二、各区域介绍 1. 程序计数器 每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执...
JVM运行时数据区和JMM
一、JVM运行时数据区        Java程序运行时,会基于类加载机制将类文件加载到JVM,并将类中的信息分解后放置到JVM的各个模块,以提供运行。程序(Java类)由数据、指令和控制(return等)组成。下面是JVM运行时数据区:1、程序计数器        指向当前线程正在执行的字节码指令的地址和行号,如果当前方法是native的,则PC寄存器的值为undefined。2、虚拟机栈(st...
JAVA内存结构和JAVA内存模型
JAVA内存结构:堆、栈、方法区; 堆:存放所有 new出来的东西(堆空间是所有线程共享,虚拟机气动的时候建立);栈:存放局部变量(线程创建的时候 被创建);方法区:被虚拟机加载的类信息、常量、静态常量等。 类加载系统:负责从文件系统或者网络加载class信息,加载的信息存放在方法区。   直接内存:JAVAnio库允许JAVA程序直接内存,从而提高性能,通常直接内存性能高于JAVA堆。读写频繁的
JVM内存模型与运行时数据区域
一、java内存模型 java定义内存模型的目的是:为了屏蔽各种硬件和操作系统的内存访问之间的差异。 java内存模型规定了所有的变量都存储在主内存中,每条线程拥有自己的工作内存,工作内存保存了主内存中变量的副本。 线程对变量操作只能在工作内存中进行,不能直接读写主内存的变量。 不同线程之间的变量访问需要通过主内存来完成。 1、ja...
JVM内存模型程序计数器、虚拟机栈、本地方法栈、堆、方法区、运行时常量池、直接内存
java内存虚拟机主要分为程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(方法区/运行时常量池)5大部分。1.程序计数器(Program Counter Register)    他记录了程序执行的字节码的行号和指令,字节码解释器工作时就是通过改变计数器值来选择下一个要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等。    由于java虚拟机多线程是通过线程轮流切换CPU时...
深入理解Java虚拟机(一)-jvm运行时数据区
前言对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写对应的delete/free代码,不容易出现内存泄漏和内存溢出问题,由虚拟机管理内存。不过,也正是Java程序员把内存控制的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解Java虚拟机是如何使用内存的,那么排查错误将会成为一项异常艰难的工作。本文将从概念上介绍Java虚拟机内存的各个区
JMM和JVM内存模型
JMM和JVM内存模型 原作者博客: Java Memory Model JVM内存模型 JVM内存模型中包括: 程序计数器(PC) java虚拟机栈 本地方法栈 java堆 方法区 程序计数器(PC) 程序计数器是一块很小的内存空间,用于记录下一条要运行的指令。每个线程都需要一个程序计数器,各个线程之中的计数器相互独立,是线程中私有的内存空间 java虚拟机...
JVM 运行时数据区——方法区、堆、栈
JVM运行时数据区分为堆,栈,方法区(元空间),我将从一个class文件加载到内存,再分配对象,再使用这个对象这样一个过程进行分析。
java虚拟机_JVM运行时数据区
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...
Java常见面试题—JVM运行时数据区域
JVM—运行时数据区域 JVM在执行JAVA程序时会把它管理的内存区域划分为若干个不同的数据区域,统称为运行时数据区,由图可见JVM程序所占的内可划分成5个部分:程序计数器、虚拟机栈(线程栈)、本地方法栈、堆(heap)和方法区(内含常量池),其中方法区和堆被所有线程共享。下面分别介绍各部分的功能:程序计数器JVM是多线程的,每一个线程都有一个独立的程序计数器(JVM是多线程的,为了线程切换后能恢复
【jvm】JAVA运行时数据区与内存分配
java虚拟机在运行时会将内存空间划分为不同的数据区域。每个区域都有各自的用途以及生命周期。有些区域伴随着JVM进程的存在而存在,有些区域“随线程而生,随线程而死”。 程序计数器作用:当前线程所执行的字节码的行号指示器,字节码解释器在工作时通过改变计数器的值来选取下一条需要执行的字节码指令。 特点: 1、线程私有,JVM多线程是通过轮流切换并分配CPU时间的,在任何一个时刻,一个CPU(一个核
JDK8之后-JVM运行时数据区域
java虚拟机运行时数据区域 首先弄清几个概念: 1.方法区(method area)只是JVM规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。永久代是HotSpot虚拟机特有的概念,是对方法区的实现,别的JVM没有永久代的概念。(虽然去除了永久代,但是方法区作为概念上的区域仍然存在) 2.在JDK8中,JDK...
JVM(一):Run-Time Data Areas(运行时数据区)/ 内存区域
一:前言 特别说明:文章中引用的图片是通过谷歌的方式找到的,当时并没有找到图片是否拥有版权,如果遇到了的话,请告知博主,我会将相应的图片删除。 本博客主要总结的是JVM的Run Time Data Areas(运行时数据区),也就是我们常说的内存区域。借用Inside Java Virtual Machine里的一句话来说明一下这一块内容。 When a Java virtual ma...
JVM组成原理(运行时数据区)
JVM组成原理(运行时数据区) JDK、JRE、JVM关系 jdk包含jre,同时还包括一些用来开发java程序使用到的像编译和debug的工具。jre主要是类库,jvm和一些其它运行java程序所使用到的组件。 JVM简介 JVM宏观上来说是一套规范,这个规范用来说明实现一个具体的JVM需要符合哪些标准,遵从哪些规范。我们知道java是一次编译到处运行的一种语言。为了达到这种
jdk7 jvm运行时数据区(后续jdk8)
引用网络内容##########jdk7                图一:JVM运行时的数据区结构JVM运行时数据区线程私有的数据区  程序计数器作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。意义 JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的指令。所以...
Java虚拟机(JVM源码):JDK10对Java虚拟机运行时数据区的划分(详细图解)
Java虚拟机运行时数据区 为什么要研究这个,因为JDK都已经发布到10了,必须要更新自己对Java虚拟机新的认识。 一、运行时数据区的划分 1.1 官方划分 关于JDK10对运行时数据区的划分,在官方文档说的非常清楚。 学习技术,一定要学会看第一手资料。 Java虚拟机规范基于JDK10地址 1.2.根据文档绘数据区图 注意: 线程共享:堆、方法区 线程私有...
Java内存管理:Java内存区域 JVM运行时数据区
Java内存管理:在前面的一些文章了解到javac编译的大体过程、Class文件结构、以及JVM字节码指令,下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点和调整参数。
java中JVM和JMM之间的区别
最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。 一 jvm结构 jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。 1 Class Loader(类加载器)就是...
Java内存模型和JVM内存管理
Java内存模型和JVM内存管理   一、Java内存模型: 1、主内存和工作内存(即是本地内存):   Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与Java编程里面的变量有所不同步,它包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共
jvm内存模型(运行时数据区)
原文:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.5运行时数据区(runtime data area)jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用。按线程共享与否可以分为线程间共享和线程间独立。线程间独立的运行时数据区线程间独立的区域随线程的创建而创建,随
JVM运行时数据区和Java内存模型
本来是想写一篇关于OOM的文章,不过感觉所要涵盖的东西会比较多,所以把内存模型分出来单独写一篇。 因为最近都在看其他大牛的博客,碎片化的学习,所以总结起来可能还有些凌乱,后续会慢慢再整理,也希望读者可以给点建议或补充,谢谢。 Java运行时数据区 先上一张图,这是我找到的最好的一张了。 Java虚拟机运行时数据区 从图来看,我们可以把Java...
@JVM内存模型(运行时数据区)
前言 说到Java内存区域,可能很多人第一反应是"堆栈"。首先堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去配对delete/free代码, 不容易出现内存泄露和内存溢出问题。但是,也正是因为Java把内存控制权交给了虚拟机,一旦出现内存泄露和内...
JVM 运行时数据区
翻译人员: 铁锚 翻译时间: 2013年11月11日 原文链接: JVM Run-Time Data Areas 参考地址: JVM运行时是什么样子? 这是阅读JVM规范时的笔记, 我画了一幅图来帮助自己加深理解: 图1 JVM运行时数据区 1. 单线程数据区(非共享) 从上图可以看出,每个线程都有自己独立的数据区,包括 PC(程序计数器),JVM(方法)栈,以及本地
JAVA内存模型与JVM内存模型的区别
** JAVA内存模型与JVM内存模型的区别 ** 直接进入正题 **JAVA内存模型: Java内存模型规定所有的变量都是存在主存中,每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行,不能直接堆主存进行操作,并且每个线程不能访问其他线程的工作内存。 Java内存模型的Volatile关键字,原子性、可见性、有序性 详情 *...
jvm 运行时数据区、String 常量池
私有 - 程序计数器:记录当前线程所执行字节码的行号指示器 - 虚拟机栈:存放了当前线程调用方法的局部变量表、操作数栈、动态链接、方法返回值等信息(可以理解为线程 的栈) - 本地方法栈:为虚拟机使用的Native方法提供服务 共享 - Java堆:占据了虚拟机管理内存中最大的一块,唯一目的就是存放对象实例,也是垃圾回收器主要管理的地方,故又称GC堆 - 方法区:存储加载的类信息...
JDK1.8 JVM内存模型
一、JDK1.8 JVM内存模型概览 这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 二、各区域介绍 1. 程序计数器 每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执行的是n...
jvm-java 内存模型 以及各个分区具体内容
java内存模型
从 JVM 内存模型谈线程安全
作为一个三个多月没有去工作的独立开发者而言,今天去小米面试了一把.怎么说呢,无论你水平如何,请确保在面试之前要做准备,就像其中一位面试官说的一样,我知道你水平不错,但是无论如何也是要准备下的,不然你怎么会连这个方法也忘记了? 此刻,我突然觉得我是一个假程序员.为什么这么说呢,作为一个从12年就开始写代码的程序员来说,忘记某个方法太可耻了.等赶明写一篇文章就叫做”我是个假程序员”来谈谈这些有趣
浅析jvm与jmm模型结构与关系
最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。 一 jvm结构 jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。 1 Class Loader(类加载器)
JVM的内存区域划分(面试问题:你了解java内存模型么)
JVM的内存区域划分   学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?   由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:
JVM内存模型的简单了解
    了解JVM的运作对于Java程序员来说是一个知根知底的过程,可以帮助程序员写出高效的代码,同时对自己代码的运转有个了解,本文我们简单地介绍下JVM的内存模型。    首先的,我们说说程序计数器,程序计数器的作用其实类似于传统处理器中的PC,是正在执行的字节码的行号指示器,通过改变自身的值,来控制需要选取哪一条字节码指令,从而做到分支、跳转、循环、异常处理等基础操作。为了保证每一次线程在获取...
JVM内存(运行时数据区)和直接内存 概念
JVM内存分为5块,其中1--3为线程隔离,4、5为线程共享。线程隔离:1、程序计数器:分支,循环跳转、异常处理、线程恢复等作用(唯一一个没有规定outofmemoryError的内存区)。2、VM stack,虚拟机栈:主要用来存放局部变量表(八种基本数据类型,对象引用也就是对象地址)。3、本地方法栈:与VM stack相似,但不同的是VM stack为JVM执行java方法服务,本地方法栈为J...
JVM数据区在JDK1.8带来的变化以及GC
        前面有介绍过jvm的在jdk1.7的运行时数据区,现在讲讲JDK1.8带来的变化,JDK1.8的运行时数据区把方法区移除了,变成了元数据区,所以之前的那个图里面的数据块应该变成如下:        在jdk1.8之前的版本,我们通常把堆分为新生代,老年代和永久代(方法区)(我们通常认为方法区也是属于堆的),新生代又包含了eden,from和to(survivor),当对象存活了超过...
2.Java虚拟机内存模型及分区
Java内存模型Java内存模型,往往是指Java程序在运行时内存的模型,而Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。Java虚拟机在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着Java虚拟
JVM 内存的结构模型、堆与堆栈原理、对象在内存中的结构
可变。存放基本数据类型和对象引用 3.堆栈:JVM的调用链     JVM内存区域模型 1.方法区 也称"永久代” 、“非堆”,  它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。 运行时常量池:是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池
JVM运行时数据区域及GC
JVM运行时数据区域及GC JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途、创建和销毁的时间。本文以Sun公司HotSpot虚拟机为例进行说明,JRockit和IBM J9会有所不同。HotSpot运行时数据区分为堆和栈两种类型,堆空间为线程共享,栈空间为线程私有。堆空间又分为方法区和堆,栈细分为虚拟机栈、本地方法栈和程序计数器,但HotSp
jvm 内存模型,数据区划分,变量存在哪里(易懂)
一 、jvm 规范中的内存划分5个部分:       1、程序计数器。(唯一没有异常出现的地方)       2、java虚拟机栈。       3、本地方法栈。       4、方法区。       5、堆。 二、变量分类: 类变量:独立于方法之外的变量,用 static 修饰。 实例变量:独立于方法之外的变量,不过没有 static 修饰。 局部变量:类的方法中的变量。。 三...
Java 内存区域-运行时数据区域
  最近在学习JVM 的相关知识。一开始看的比较快,对JVM 运行时数据区域只有一个模糊的概念,不太清楚不同内存区域里面到底存放了那些数据,所以在此记录。   我们都知道Java 与C、C++ 最大的区别就是内存管理领域(Java 有内存动态分配和垃圾收集技术)。在《深入理解Java虚拟机》中描述C、C++ 对内存的管理:对于从事C、C++ 的程序开发人员来说,在内存管理区域,他们即是拥有最高权...
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习java疑惑 java内存模型学习