当前位置: 首页 > news >正文

【实战JVM】-基础篇-03-Java内存结构

【实战JVM】-基础篇-03-Java内存结构

  • 1 运行时数据区
    • 1.1 总览
    • 1.2 程序计数器
      • 1.2.1 是否会内存溢出
    • 1.3 java虚拟机栈
      • 1.3.1 栈帧的组成
        • 1.3.1.1 局部变量表
        • 1.3.1.2 操作数栈
        • 1.3.1.3 帧数据
          • 1.3.1.3.1 动态链接
          • 1.3.1.3.2 方法出口
          • 1.3.1.3.3 异常表
      • 1.3.2 是否会内存溢出
      • 1.3.3 设置虚拟机栈大小
        • 1.3.3.1 注意事项
    • 1.4 本地方法栈
    • 1.5 堆
      • 1.5.1 是否会内存溢出
      • 1.5.2 Java堆
        • 1.5.2.1 Arthas查看堆内存
        • 1.5.2.2 默认参数
    • 1.6 方法区
      • 1.6.1 元信息
      • 1.6.2 运行时常量池
      • 1.6.3 字符串常量池
      • 1.6.4 神奇的intern
      • 1.6.5 方法区实现
      • 1.6.6 是否会内存溢出
      • 1.6.7 静态变量的存储
    • 1.7 直接内存


1 运行时数据区

运行时数据区负责管理jvm使用到的内存,比如创建对象和销毁对象。

1.1 总览

在这里插入图片描述

在这里插入图片描述

1.2 程序计数器

在这里插入图片描述

在这里插入图片描述

1.2.1 是否会内存溢出

在这里插入图片描述

简单来说,PC计数器就两个作用:

  • 对于单线程环境,保存下一条需要执行的指令的内存地址。
  • 对于进程来说,用于保存上下文信息,方便切换。

1.3 java虚拟机栈

在这里插入图片描述

1.3.1 栈帧的组成

在这里插入图片描述

1.3.1.1 局部变量表

在这里插入图片描述

在这里插入图片描述

  • 起始PC:表示根据字节码哪一行可以使用该局部变量
    • i就是在0、1之后完成初始化,234可以使用,所以长度是3,j就是1

在这里插入图片描述

在这里插入图片描述

静态方法的局部变量表不包括自己this,而实例方法中的局部变量表存放着this,局部变量也会占用槽

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3.1.2 操作数栈

在这里插入图片描述

1.3.1.3 帧数据
1.3.1.3.1 动态链接

在这里插入图片描述

1.3.1.3.2 方法出口

在这里插入图片描述

1.3.1.3.3 异常表

在这里插入图片描述

1.3.2 是否会内存溢出

在这里插入图片描述

在这里插入图片描述

1.3.3 设置虚拟机栈大小

在这里插入图片描述

1.3.3.1 注意事项

在这里插入图片描述

1.4 本地方法栈

在这里插入图片描述

1.5 堆

在这里插入图片描述

成员变量存放于中,局部变量存放于中(由局部变量表维护)。

jdk8之前,静态变量存放在方法区中,jdk8之后,静态变量存放在中。

堆是线程共享的,所以针对需要多线程使用的环境,可以将变量变为静态变量以达到我们的需求。

1.5.1 是否会内存溢出

在这里插入图片描述

1.5.2 Java堆

在这里插入图片描述

1.5.2.1 Arthas查看堆内存
dashboard -i 刷新频率(毫秒)

查看堆内存used、total、max

在这里插入图片描述

1.5.2.2 默认参数

如果不设置默认参数,默认max是系统内存的1/4,total默认是系统内存的1/64。

在这里插入图片描述

建议将-Xmx和-Xms设置为相同的值,这样在程序启动之后可使用的总内存就是最大内存,而无需向java虚拟机再次申请,减少了申请并分配内存时间上的开销们也不会出现内存过剩之后,堆收缩的情况。

在这里插入图片描述

1.6 方法区

在这里插入图片描述

1.6.1 元信息

在这里插入图片描述

1.6.2 运行时常量池

解析阶段将常量池中的符号引用替换为直接引用

在这里插入图片描述

1.6.3 字符串常量池

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.6.4 神奇的intern

在这里插入图片描述

jdk6

在这里插入图片描述

jdk7之后

在这里插入图片描述

主要是因为jdk7之后,字符串常量池是在堆中的,而方法区是在永久代里的;jdk8字符串常量池是在堆中的,而方法区是在元空间里的。

1.6.5 方法区实现

在这里插入图片描述

在这里插入图片描述

1.6.6 是否会内存溢出

在这里插入图片描述

没有过高要求设置256M即可,但是元空间一定要设置。

1.6.7 静态变量的存储

在这里插入图片描述

1.7 直接内存

方法区是放在元空间中,属于操作系统中的直接内存。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关文章:

  • mybatis 注解式 XML式 通用mapper(tk-mybatis)使用
  • Spring AOP源码分析
  • 基于MetaGPT构建LLM多智能体
  • c++ using 关键字
  • React 路由5版本的使用详解(基于Class类版本的使用react-router-dom@5)
  • 【编译原理复习笔记】中间语言
  • RK 11.0 多屏模式下修改鼠标进入方式
  • Web3 知识体系架构图
  • Shell编程规范与变量
  • VMware安装Windows11
  • ISCC——AI
  • getters的使用
  • uniapp开发微信小程序问题集锦(1)
  • Hadoop概览以及编译hadoop说明
  • SpringBoot高级原理详解
  • 分享一款快速APP功能测试工具
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Java编程思想》读书笔记-对象导论
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android单元测试 - 几个重要问题
  • angular2开源库收集
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • crontab执行失败的多种原因
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • javascript从右向左截取指定位数字符的3种方法
  • Java教程_软件开发基础
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • overflow: hidden IE7无效
  • vue-cli在webpack的配置文件探究
  • 利用jquery编写加法运算验证码
  • 源码安装memcached和php memcache扩展
  • 运行时添加log4j2的appender
  • Java数据解析之JSON
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #if等命令的学习
  • #laravel 通过手动安装依赖PHPExcel#
  • %@ page import=%的用法
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)ssm高校实验室 毕业设计 800008
  • (十三)Flask之特殊装饰器详解
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)ObjectiveC 深浅拷贝学习
  • (转)创业家杂志:UCWEB天使第一步
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .env.development、.env.production、.env.staging
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • @Async注解的坑,小心
  • @property python知乎_Python3基础之:property