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

Java 内存模型简述

作者头像
水货程序员
发布2018-11-13 18:05:28
5670
发布2018-11-13 18:05:28
举报
文章被收录于专栏:javathingsjavathings

Java 内存模型是面试官最喜欢问的问题之一。

Java 内存在逻辑功能上分成 5 个区。方法区,堆区,JVM 栈,方法栈,程序计数器(PC 寄存器)。

其中方法区,堆区是所有线程都共享的。JVM 栈,方法栈,程序计数器(PC 寄存器)是每个线程都有独立的一份。

JVM 栈就是程序运行时候的栈,局部变量之类的都存放与此,函数的调用和结束,对应的就是元素的入栈和出栈。递归调用深度过深的话,就会出现 StackOverflow 的错误。JVM 栈中有很多栈帧,每个栈帧都对应一个被调用的方法,栈帧中有局部变量表,用来存储方法中的局部变量。由于每一个线程都有自己的 JVM 栈,所以运行时是互不干扰的。

本地方法栈和 JVM 栈类似,区别就是 JVM 栈运行的 Java 代码,本地方法栈运行的是 NativeCode。

方法区,存放的是 JVM 加载的类的信息,各种静态变量等信息,是全局共享的。Java8 中已经移除了方法区,增加了一个叫做元空间的本地内存区,不过元空间与方法区是有区别的,元空间使用的是本地内存,而不是 JVM 中划分的。所以,元空间的大小仅和本地内存大小有关,元空间的大小可以通过参数来设置。

Java1.7 之前,字符串常量池存放在方法区,Java1.7 之后移到了堆区。

堆区就是所有的实例对象都放在里面,所有的线程都能访问,垃圾回收也主要在这里发生。根据 Java 虚拟机规范的规定,Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。

程序计数器也称作 PC 寄存去,和汇编程序中的 CPU 寄存器概念是类似的,都是用来指示执行的之类地址。每个线程都有各自的程序计数器,互相独立互不干扰。

Java 内存模型划分就是以上几种。但是细究下去还有其他的更多的知识点,比如原子性,可见性等概念。会在后续的文章中讨论。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档