前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >请分清楚Java内存区域和Java内存模型

请分清楚Java内存区域和Java内存模型

作者头像
袁新栋-jeff.yuan
发布2020-08-26 18:18:52
4570
发布2020-08-26 18:18:52
举报

java内存区域是java虚拟机在执行java程序的时候会把它所管理的内存进行划分不同的数据区域但是java内存模型是为了屏蔽各种硬件和操作系统的内存访问的差异,已实现java程序在不同的操作系统中都能达到一致的访问效果

Java内存区域

1. 线程共享区

  • 堆:堆可分为eden区和survior to和survior from 区 刚创建的对象,且堆内存够放下这个对象,都会放在eden区。
  • 方法区: 存储已经被加载的类信息,常量,静态变量,即时编译后的代码等数据。在hotspot虚拟机中方法区也被称为老年代。

2. 线程独享区

  • Java虚拟机栈:在我们代码在运行是调用一个方法就会创建一个栈帧用于存储局部变量表,动态链接,操作数栈,方法出口等。调用方法的过程也就是压栈和弹栈的过程,栈的数据结构是先进后出的我们可以想一下主方法调用其他方法,其他方法调用完成那其他的方法就弹栈了谈完后其以及已经将动态链接的数据已经改变,于是你的主方法内的数据也随即改变。仔细品品。
  • 本地方发栈: 本地方法栈和Java虚拟机栈的作用类似,Java虚拟机栈是为java方法的使用而执行的,但是本地方法栈是为了Java虚拟机调用的native方法执行的。正是因为本地方法栈不会限制使用的语言,使用的方法还有数据结构。
  • 程序计数器:粗糙一点也就是为了记录代码执行到那一块了。还有就是我们在执行多线程的时候,在虚拟机中并不是所谓的同步执行的,而是通过线程的切换并分配处理器的时间的方式来实现的,所以在切换的过程中有的线程执行了一半,又切换到了其他线程那就得将其字节码指令执行到那一块就得记录下来,这也是程序计数器为什么是私有的原因。

3. 直接内存(非Java虚拟机中运行时动态区域,但是也会引起OOM)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MSDffKes-1588523651379)(47A49CD3238948398729B5DD70C4D87F)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MSDffKes-1588523651379)(47A49CD3238948398729B5DD70C4D87F)]
  • 直接内存并不属于JVM动态运行时区域,我们在使用NIO的时候基于通道与缓冲区的方式(buffer)的I/O的方式,他可以使用native函数库直接分配堆外内存 ,然后通过存储在Java堆种的dirctyByteBuffer对象作为这块堆内存的一面用进行操作。

java内存模型

  1. Java的内存模型重要的目标是定义程序中的各个变量的访问规则。即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处变量只是针对全局变量和静态字段,和构成数组的对象元素。
  2. Java的内存模型分为 主内存,工作内存。
  • 工作内存:每一个线程都拥有自己的工作内存,工作内存保存的是从主内存复制拷贝过来的副本,不同的线程之间是不可以直接进行工作内存的访问,必须通过主内存作为中间人才可以访问。
  • 主内存:主内存就用来存放所有的公共变量。线程间可以共享的变量。
  • Java内存模型和Java运行时动态内存模型类比的话,那么主内存就是其Java堆中的那些对象实例,而工作内存区域就是Java虚拟机栈中的局部变量表还有refrence所指向的数据,还有方法参数等。
在这里插入图片描述
在这里插入图片描述

思考一下

volatile关键字是如何达到变量在各个线程间是可见的呢?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java内存区域
  • java内存模型
    • 思考一下
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档