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

JVM 笔记

JVM HotSpot

Java二进制字节码的运行环境

好处:

  • 一次编写,到处运行
  • 自动内存管理,具有垃圾回收功能
  • 数组下标越界检查
  • 多态(虚方法表)

JVM组成

  • 类加载子系统(Java代码转换为字节码)
  • 运行时数据区(字节码加载到内存)
  • 执行引擎 解释器、即时编辑器、GC垃圾回收(字节码翻译为底层系统指令)
  • 本地方法接口

运行时数据区

程序计数器

记录下一条要执行的字节码指令的地址

如果正在执行本地方法,则计数器的值为空

  • 每个线程都要有自己的程序计数器,程序计数器是线程私有的
  • 没有规定任何OutOfMemoryError情况
Java虚拟机栈

线程私有,生命周期与线程相同
每个方法被执行的时候,JVM都会同步地创建一个栈帧(存储)
方法调用、执行完毕对应栈帧在虚拟机栈中的入栈到出栈
局部变量表 存储编译期可知的JVM基本数据类型、对象引用、returnAddress

  • 每个线程运行时需要的内存,称为虚拟机栈
  • 栈帧对应每次方法调用占用的内存
  • 每个线程只能有一个活动栈帧

-Xss 可用指定栈内存分配大小 Linux默认1024

栈内存溢出
原因:

  • StackOverflowError栈帧过多,方法调用过多(递归调用过多层,使用第三方库进行json数据转换,两个实体互相依赖)
  • OutOfMemoryError栈帧过大
    CPU占用过高怎么诊断?
  • Linux 的top命令,监测后台进程
  • ps H -eo pid,tid,%cpu | grep 进程id ps命令定位线程
  • jstack 进程id
  • 将第二部定位的线程id转换成16进制,在第三步得到的信息中,查看问题线程
本地方法栈

虚拟机栈为虚拟机执行Java方法,本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

Java堆(GC堆,垃圾回收)

线程共享的
堆内存溢出:
-Xmx 设置堆空间的最大值,排除内存溢出问题时,可用把堆内存设置小一点
jps 查看系统中有那些java进程
jmap 查看堆内存占用情况 jmap -heap 线程id
jconsole

tips: jconsole中有检测死锁按钮
jvisualvm
堆Dump查看堆快照,可用查看到对象信息

方法区

线程共享、堆的逻辑部分,别名“非堆”
存储已经被JVM加载的 类型信息、常量、静态变量、即时编译后的代码缓存

JDK8以前,HotSpot虚拟机把手机器的分代回收扩展至方法区,使用永久代来实现方法区垃圾收集器能够像管理Java堆一样管理这部分内存,省去专门为方法区编写内存管理代码的工作。

  • JDK8完全放弃永久代

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行时常量池

常量池 虚拟机指令根据常量池(一张表)找到要执行的类名、方法名、参数类型、字面量等信息。

运行时常量池 类被加载,类的常量池信息会放入运行时常量池,并把符号地址变为真实地址
StringTable 哈希表结构,存储字符串常量

直接内存

操作系统内存

  • 常见于NIO操作,用户数据缓存区
  • 分配回收成本较高
  • 不受JVM内存回收管理
HotSpot对象
  • 字节码new指令
  • 检查指令的参数能否在常量池中定位到 一个类的符号引用
  • 检查符号引用代表的类是否已经被 加载、解析和初始化,没有则先执行相应类加载过程
  • 分配内存
  • 初始化
  • 设置对象头

内存分配: GC是否有空间压缩整理能力 – 有-> 指针碰撞;无 -> 空闲列表

线程安全问题:同步处理 CAS;本地线程分配缓冲 每个线程在Java堆预先分配一小块内存,线程本地缓冲区用完了,分配新的缓存区才同步锁定

对象的内存布局
对象在堆中的存储布局对象头、实例数据、对齐填充

根节点枚举
  • 固定可作为GC Roots的节点主要在全局性引用(常量或类静态属性)于执行上下文(例如栈帧中的本地变量表)
  • 根节点枚举必须在一个能够保障一致性的快照中
  • 根节点枚举必须暂停用户线程 Stop The World
    OopMap数据结构来直接得到哪些地方存放着对象引用
安全点 以“是否具有让程序长时间执行的特征”来选定

用户程序只有执行到 安全点 才能暂停

如何控制GC时,所有线程跑到安全点,停下?

  • 抢先式中断 全部中断,未到安全点线程复活,过一会儿再中断
  • 主动式中断 标记线程,安全点轮询

    用户程序只有执行到 安全点 才能暂停

如何控制GC时,所有线程跑到安全点,停下?

  • 抢先式中断 全部中断,未到安全点线程复活,过一会儿再中断
  • 主动式中断 标记线程,安全点轮询

相关文章:

  • 常见的网络安全威胁和防护方法
  • C++——构造函数
  • Android使用ScrollView导致鼠标点击事件无效
  • LeetCode 热题 100 | 链表(上)
  • 解决Docker AList本地挂载失效的问题。
  • 免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理
  • 影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)
  • npm 以组织为单位发布依赖包(@username/package-name、@org-name/package-name)
  • 【全网最全】2024美赛ABCDEF题思路模型全解(后续会更新)
  • go语言标准库flag命令行参数解析
  • HDFS Federation前世今生
  • ChatGPT炸裂了
  • Mac安装及配置MySql及图形化工具MySQLworkbench安装
  • 贪吃蛇/链表实现(C/C++)
  • Django_基本增删改查
  • [nginx文档翻译系列] 控制nginx
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CSS 提示工具(Tooltip)
  • Hibernate最全面试题
  • js递归,无限分级树形折叠菜单
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Promise面试题2实现异步串行执行
  • React系列之 Redux 架构模式
  • yii2权限控制rbac之rule详细讲解
  • 闭包--闭包作用之保存(一)
  • 关于for循环的简单归纳
  • 关于使用markdown的方法(引自CSDN教程)
  • 经典排序算法及其 Java 实现
  • 前端性能优化——回流与重绘
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 提醒我喝水chrome插件开发指南
  • 一份游戏开发学习路线
  • 自定义函数
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云服务器如何修改远程端口?
  • ​Spring Boot 分片上传文件
  • #1014 : Trie树
  • #include到底该写在哪
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zt)最盛行的警世狂言(爆笑)
  • (八十八)VFL语言初步 - 实现布局
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .naturalWidth 和naturalHeight属性,
  • .Net 4.0并行库实用性演练
  • .NET Core 中的路径问题
  • .net framework profiles /.net framework 配置
  • .NET处理HTTP请求