Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >堆、栈、方法区—JVM 内存模型分析

堆、栈、方法区—JVM 内存模型分析

作者头像
用户4464623
发布于 2020-09-10 07:46:07
发布于 2020-09-10 07:46:07
5420
举报
文章被收录于专栏:晨曦破晓の家晨曦破晓の家

前言

不论是正经或者不正经的程序猿要想变强不能光光变秃,你还必须掌握JVM相关的底层知识。

JVM 内存模型

首先先来看看下面的图这是一张JVM内存模型的一个概况图

348A1B9B-87A2-4af1-BFD0-0EEA8251343C.png

接下来我们对于运行时数据区的五个内存区域做一个简单的介绍:

1. Java虚拟机栈

虚拟机栈描述的是Java方法执行的动态内存模型。当我们的栈空间不足时,就会抛出StackOverFlowError

  • 栈帧:每一个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态链接,方法出口等信息
  • 局部变量表:存放编译器可知的各种数据类型,引用类型,returnAddress类型。局部变量表的内存空间在编译器完成分配,当进入一个方法的时候,这个方法需要在帧中分配多少内存是固定的,方法运行期间是不会改变局部变量表的大小。

2. 本地方法栈

与虚拟机栈基本类似(栈的空间大小远远小于堆)

  • 虚拟机栈为虚拟机执行Java方法服务
  • 本地方法栈为虚拟机栈执行native方法服务

3. 堆内存

java进程运行过程中创建的对象存放在堆中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。

堆内存是所有线程共有的,下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。

堆的内存模型大致为如下:

image

默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。 老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。 默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。 JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。 因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间

新生代是 GC 收集垃圾的频繁区域。 当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳

( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。

但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。

4. 程序计数器

几乎不占有内存。用于取下一条执行的指令。

  • 程序计数器是一块较小的内存区域,是当前线程所执行的字节码文件的行号指示器
  • 程序计数器处于线程独占区
  • 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果执行的是native方法,这个计数器的值是undefined
  • 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

5. 方法区

方法区也称”永久代“,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB(64位JVM由于指针膨胀,默认是85M),可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。它是一片连续的堆空间,永久代的垃圾收集是和老年代(old generation)捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。不过,一个明显的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误。参数是通过-XX:PermSize和-XX:MaxPermSize来设定的。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在Ubuntu 18.04上安装和配置GitLab
GitLab CE或Community Edition是一个开源应用程序,主要用于托管Git存储库,以及其他与开发相关的功能,如问题跟踪。它旨在使用您自己的基础架构进行托管,并为您的开发团队提供部署内部存储库的灵活性,与用户交互的公共方式,或者为贡献者提供托管自己项目的方法。
你在哪里
2018/09/28
14.6K0
如何在Ubuntu 16.04上安装和配置GitLab
GitLab CE或Community Edition是一个开源应用程序,主要用于托管Git存储库,还有其他与开发相关的功能,如问题跟踪。它旨在使用你自己的基础架构进行托管,并且可以灵活地部署为开发团队的内部存储库,公开作为与用户交互的方式,甚至可以作为贡献者托管自己项目的方式。
楠宝宝
2018/08/03
2.1K0
如何在Ubuntu 16.04上安装和配置GitLab
CentOS 7 下 GitLab安装部署教程
GitLab一个开源的git仓库管理平台,方便团队协作开发、管理。在GitLab上可以实现完整的CI(持续集成)、CD(持续发布)流程。而且还提供了免费使用的Plan,以及免费的可以独立部署的社区版本(https://gitlab.com/gitlab-org/gitlab-ce )。
KenTalk
2018/09/11
8.4K0
CentOS 7 下 GitLab安装部署教程
GitLab的安装与部署
在 CentOS 7(和 RedHat/Oracle/Scientific Linux 7)上,下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问 GitLab,则可以跳过它。
摘繁华
2021/12/27
8310
GitLab的安装与部署
【Linux系列】CentOS-7下GitLab安装部署教程
最近在学习 Jenkins,需要使用到 gitlab,所以记录下gitlab安装过程。
框架师
2021/11/22
4.6K0
【Linux系列】CentOS-7下GitLab安装部署教程
git操作:在CentOS7上面搭建GitLab服务器
首先要在CentOS系统上面安装所需的依赖:ssh、防火墙、postfix(用于邮件通知)、wegt,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问。
拓荒者
2019/09/24
6680
git操作:在CentOS7上面搭建GitLab服务器
在centos7搭建gitlab
虽然可托管代码的平台有很多选择,国外的有 github,国内的有 gitee 之类,但很多公司都会选择自建 gitlab 服务,觉得将代码托管在第三方,内心并不踏实
章鱼喵
2019/08/24
1K0
CentOS 7下安装指定版本的GitLab
添加镜像地址的目的是为了提高国内用户软件下载的速度,编辑(新建)文件gitlab-ce.repo,指令:
似水的流年
2019/12/05
2.9K0
基于CentOS 7搭建GitLab
打开 /etc/sysctl.conf 文件,在文件最后添加新的一行并按 Ctrl + S 保存:
菲宇
2019/06/12
5190
基于CentOS 7搭建GitLab
Gitlab的安装
Gitlab安装 1.安装相关依赖 yum -y install policycoreutils openssh-server openssh-clients postfix 2.启动ssh服务&设置为开机启动 systemctl enable sshd && sudo systemctl start sshd 3.设置postfix开机自启,并启动,postfix支持gitlab发信功能 systemctl enable postfix && sudo systemctl start postfix 如
阿超
2022/08/16
4570
Gitlab的安装
CentOS7.x 搭建 GitLab 教程
今天闲来无事,想起之前买了一个阿里云 ECS,一直闲置着没用,一时兴起就想搭个自己的 GitLab 玩玩,GitLab 官网也提供了安装教程,很简单,照着步骤一步步基本没什么问题,可能安装的过程中有一些坑需要自己去解决。
程序员飞飞
2020/02/27
1.8K0
CentOS7.x 搭建 GitLab 教程
CentOS 7 安装GitLab
该文介绍了在CentOS 7服务器上安装配置GitLab所需的所有步骤,包括安装依赖项、配置SSH和SMTP、安装GitLab、添加GitLab仓库以及启动GitLab。
shaonbean
2018/01/02
1.9K0
CentOS7安装GitLab、汉化、邮箱配置及使用
猿人谷
2017/12/22
6.6K0
搭建Gitlab
###3、gitlab的使用 在浏览器中输入 http://192.168.60.119/ ,然后 change password: ,并使用root用户登录 即可 (后续动作根据提示操作)
Cyylog
2020/08/19
9230
Linux学习14-CentOS安装gitlab环境
在学习Gitlab的环境搭建之前,首先需要了解Git,Gitlab,GitHub他们三者之间的关系
上海-悠悠
2019/05/06
1K0
Linux学习14-CentOS安装gitlab环境
基于CentOS7搭建GitLab
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
拓荒者
2019/09/24
1.8K0
基于CentOS7搭建GitLab
腾讯云Centos安装gitlab
参考了网上很多人写的安装教程,结果并不好,最后阅读了官方的英文api,才安装成功,这里记录下来,方便以后使用。我的安装环境为腾讯云主机Centos7.3 64bit
河岸飞流
2019/08/09
5.6K0
CentOS7安装维护Gitlab
下面是官网复制过来的官方安装方法,最简单的安装,在我大天朝,只能望天兴叹,你可翻墙安装或者略过这里,看下面的。
小弟调调
2018/09/11
5.1K0
搭建自己的Gitlab
sudo EXTERNAL_URL="https://gitlab.congzhizhi.com" yum install -y gitlab-ee 如果用的是国内仓库地址,则执行以下命令,其实区别就是ee和ce版 sudo EXTERNAL_URL="https://gitlab.congzhizhi.com" yum install -y gitlab-ce 此时要么买一个域名,要么在本地的hosts文件中设置一下 安装gitlab服务器的ip地址 gitlab.congzhizhi.com 假如不想设置域名,可以直接安装 yum install -y gitlab-ee
源码之路
2021/04/09
8800
Linux(centos7)搭建gitlab
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/24
1.6K0
Linux(centos7)搭建gitlab
相关推荐
如何在Ubuntu 18.04上安装和配置GitLab
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档