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.mzph.cn/news/662963.shtml

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

相关文章

openEuler 22.03 登录提示设置

在openEuler系统中,您可以通过编辑 /etc/motd 文件来设置登录提示信息。motd 是 “Message of the Day” 的缩写,它通常包含当天的提示信息,在用户成功登录到Linux系统后显示。 以下是详细步骤:1、打开终端。2、使用文本编辑器打开…

【JavaEE进阶】 图书管理系统开发日记——贰

文章目录 🌲前言🎄设计数据库🍃引⼊MyBatis和MySQL驱动依赖🌳Model创建🎍约定前后端交互接口🍀服务器代码🚩控制层🚩业务层🚩数据层 🌴效果展示⭕总结 &#…

01- k8s基础网络知识 之 underlay与overlay网络

前言: 我们在学习k8s网络之前,必须要了解k8s网络相关的一些基础知识,比如什么是underlay网络、overlay网络等,只有把基础知识掌握之后,后续学习k8s网络的时候,一些知识点就不会再云里雾里了。 1 underlay与…

协作办公开源神器:ONLYOFFICE

目录 前言ONLYOFFICE为什么选择ONLYOFFICE强大的文档编辑功能多种协作方式多人在线协同支持跨端多平台连接器安全性极高本地部署 ONLYOFFICE 8.0版本震撼来袭可填写的 PDF 表单显示协作用户头像更新插件界面设计更快更强大 总结 前言 近几年来,随着互联网技术的不断…

如何解决 docker registry x509 证书不信任问题?

最近想尝试一下极狐GitLab(可以理解为 GitLab 在中国的发行版)内置的容器镜像仓库,这样就不用自己安装 Harbor 之类的了。于是找了个服务器安装了一个极狐GitLab 的私有化部署版本,安装过程可以参考过往的技术文章使用Omnibus 安装…

2024前端技术趋势分析

文章目录 前端技术趋势分析无代码/低代码开发优点主要应用场景目前代表性技术 WebAssembly优点应用场景代表性技术 跨平台技术优点应用场景代表性技术 人工智能在前端的应用优点应用场景 总结 前端技术趋势分析 前端技术是 Web 开发的重要组成部分,它负责呈现用户界…

nodejs制作一个简单线程池

ThreadPool 类 const { Worker,parentPort,isMainThread } require(worker_threads) //主线程 if(isMainThread){class ThreadPool {size 5;queue [];workerGroup [];free0;maxFree2;monitornull;constructor(size) {this.size size;}//初始化子线程init(){for (let i 0…

在Windows搭建gRPC C++开发环境

本文介绍在Windows下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境,以及开发、配置一个简单的c服务端以及.net客户端。 0、前置条件 1、下载gRPC源码 使用git命令行在预备存放grpc源码的目录下执行, 此处我们下载的是 grpc 1.48.0 git clone -b v1.48.0 …

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因: matplotlib版本升级之后显示代码变了,修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

测试环境搭建整套大数据系统(一:基础配置,修改hostname,hosts,免密,时间同步)

一:使用服务器配置。 二:修改服务器名称hostname,hosts。 在 Linux 系统中,hostname 和 /etc/hosts 文件分别用于管理主机名和主机名解析。 在三台服务器上,分别执行以下命令。 vim /etc/hostnamexdso-hadoop-test-0…

android 11 自定义Android device owner 接口

在设置里面自定义广播 去处理下面的事情 ComponentName mComponentnew ComponentName(packageName,receiverName); DevicePolicyManager mDPM.setDeviceOwner(mComponent,"d_owner_"mUserId); int mUserId android.os.Process.myPid(); int uid android.os…

༺༽༾ཊ—Unity之-04-原型模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务1:使用 建造者模式 创建三种 金刚猿猴 零部件 拼接组合 首先资源商店下载 金刚猿猴 模…

常见的词法分析和语法分析的开源库收集

文章目录 一、词法及语法分析器汇总1.Flex2.Bison3.ANTLR3.Ply4.JFlex 一、词法及语法分析器汇总 1.Flex Flex是一个用于生成词法分析器的工具。它可以根据用户定义的正则表达式规则,将输入的字符流分割成一个个的词法单元。Flex是GNU项目的一部分,可以…

Redis数据淘汰策略

Redis作为一种高性能的键值存储数据库,通常用于缓存和提高数据检索速度。然而,由于内存资源有限,当内存不足以容纳所有数据时,Redis就需要采取一些策略来删除部分数据,以确保新的数据能够被写入。这就引入了数据淘汰策…

刨析数据结构(二)

🌈个人主页:小田爱学编程 🔥 系列专栏:数据结构————"带你无脑刨析" 🏆🏆关注博主,随时获取更多关于数据结构的优质内容!🏆🏆 😀欢迎…

strlen函数详解

🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:c语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&a…

猜凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这…

动态微信小程序码和开发者工具解析小程序码

一、动态生成微信小程序码 1、方式一 微信官方网站,对已发布的小程序,提供了一个快捷的入口,输入微信小程序的page页面即可。 page页面可以通过右侧开启入口获取 也可以通过开发者工具左下角的页面地址和参数地址那里获取到 二、生成的小…

【软件设计师笔记】计算机系统基础知识考点

【考证须知】IT行业高含金量的证书(传送门) 💖 【软件设计师笔记】程序语言设计考点(传送门) 💖 【软件设计师笔记】操作系统考点(传送门) 💖 🐓 计算机系统组成 计算机系统是由硬件和软件组成的,它们协同工作来运…

(Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息

国家青藏高原科学数据中心下载中国1千米分辨率逐日全天候地表土壤水分数据集(2003-2022) 问题:数据在arcgis打开特别大,无法和矢量数据重合,没有设置地理坐标系 数据在网站上提供了投影信息,提示可以进行py…