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时,所有线程跑到安全点,停下?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247208.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt6入门教程 12:QAbstractButton

目录 一.状态 二.信号 三.使用 1.自定义按钮 2.多选 3.互斥 QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮。QAbstractButton类是所有按钮控件的基类。 QAbstractButton提供…

Python笔记14-实战小游戏飞机大战(上)

文章目录 功能规划安装pygame绘制游戏窗口添加玩家飞机图像屏幕上绘制飞船代码重构驾驶飞船全屏模式射击 本示例源码地址 点击下载 功能规划 玩家控制一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键射击。游戏开始时&#xff…

1948-2022年金融许可信息明细数据

1948-2022年金融许可信息明细数据 1、时间:1948-2022年 2、来源:银监会(银监会许可证发布系统) 3、指标:来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、…

Leetcode—2942. 查找包含给定字符的单词【简单】

2023每日刷题&#xff08;一零一&#xff09; Leetcode—2942. 查找包含给定字符的单词 实现代码 class Solution { public:vector<int> findWordsContaining(vector<string>& words, char x) {vector<int> ans;for(int i 0; i < words.size(); i)…

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

文章目录 动态库和静态库1.静态库和动态库的介绍2.静态库的打包和使用2.1生成静态库2.2使用静态库的三种方式2.2.1gcc编译2.2.2拷贝到系统默认的路径2.2.3建立软连接 3.动态库的打包和使用3.1生成动态库3.2使用动态库3.3解决加载不到动态库的方法 动态库和静态库 1.静态库和动…

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理 1 安装 scrcpy 地址 https://github.com/Genymobile/scrcpy 转到 relese 下载 我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz 下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1 解压scrcpy-2.3…

林浩然的奇幻编程之旅:幽默探索图灵的智慧宇宙

林浩然的奇幻编程之旅&#xff1a;幽默探索图灵的智慧宇宙 Lin Haoran’s Fantastical Coding Journey: Humorous Exploration of Turing’s Intelligent Universe 林浩然&#xff0c;一个对计算机科学怀揣着无尽好奇的探索者&#xff0c;像一只闯入魔法森林的小狐狸&#xff0…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

Excel·VBA时间范围筛选及批量删除整行

看到一个帖子《excel吧-筛选开始时间&#xff0c;结束时间范围内的所有记录》&#xff0c;根据条件表中的开始时间和结束时间构成的时间范围&#xff0c;对数据表中的开始时间和结束时间范围内的数据进行筛选 目录 批量删除整行&#xff0c;整体删除批量删除整行&#xff0c;分…

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-LSTM多变量时间序列预测&#x…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时&#xff0c;它将会执行系统的关机命令。 具体来说&#xff0c;system("shutdown")的功能是向操作系统发送一个关机信号&#xff0c;请求关闭计算机。这将触发操作系统执行一系列…

vscode的扩展商店使用时报错 XHR failed

文章目录 前言解决扩展商店的使用github的相关问题 前言 这几天使用vscode扩展商店安装插件时发现一搜索就报错&#xff0c;网上搜了一些解决方法&#xff0c;看起来不大靠谱。而且用了好几年了vscode都没出现过这个问题&#xff0c;感觉是网络问题。 解决扩展商店的使用 首先…

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!

首先给大家送上预览地址&#xff1a; 官网地址&#xff1a;https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址&#xff1a;http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能&#xff1f; 第一个问题&#xff0c;官方网页…

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用 Arthas常用命令Arthas的安装Linux压测工具Apache Bench安装火焰图的使用火焰图如何分析火焰图的互动 Arthas常用命令 help &#xff1a;查看所有命令dashboard &#xff1a;仪表板&#xff0c;查看线程的CPU信息等heapdump &#xff1a;不同类对象占用内存比重&a…

python算法与数据结构---滑动窗口双指针

学习目标 了解滑动窗口的基本原理&#xff1b;学会用使用python语言解答滑动窗口经典题目&#xff1b;了解双指针的基本原理&#xff1b;学会使用python语言解答双指针经典题目&#xff1b; 滑动窗口 209. 长度最小的子数组 https://leetcode.cn/problems/minimum-size-sub…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…

linux 的nobody是什么用户? 对安全有没有影响?

目录 一、nobody是不是可疑用户&#xff1f; 二、Linux系统中的nobody用户&#xff1f; 三、有nobody用户存在&#xff0c;安全吗&#xff1f; 一、nobody是不是可疑用户&#xff1f; 在Linux系统中&#xff0c;nobody是一个特殊的用户账户&#xff0c;通常用于运行系统服务…

UE5在VisualStudio升级后产生C++无法编译的问题

往期的虚幻引擎项目在VS更新后&#xff0c;编译时会报错&#xff0c;这一般出现在VS升级之后&#xff0c;UE对于VC的编译器定位没有更新导致&#xff1b; 有出现如下问题&#xff1a; 问题1&#xff1a; Running I:/EPCI/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.ba…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式&#xff1f; 设计模式七大原则单一职责原则&#xff08;Single Responsibility Principle - SRP&#xff09;开放封闭原则&#xff08;Open/Closed Principle - OCP&#xff09;里氏替换原则&#xff08;Liskov Substitution …