JVM-Java程序的运行环境

news2025/7/15 1:14:13

Java Virtual Machine Java程序的运行环境

JVM组成
  • 程序计数器

    • 线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
  • Java堆

    • 线程共享的区域: 主要用来保存对象实例, 数组等, 当堆中没有内存空间可分配给实例也无法再扩展时, 则抛出OutOfMemoryError异常
    • 组成: 年轻代+老年代
    • JDK1.7中存在一个永久代, 存储的是类信息, 静态变量, 常量, 编译后的代码
    • JDK1.8移除了永久代, 把数据存储到本地内存的元空间中防止内存溢出
  • 虚拟机栈

    • 每个线程运行时所需要的内存称为虚拟机栈, 先进后出
    • 每个线程只有一个活动栈帧, 对应着当前正在执行的那个方法
    • 栈内存不是越大越好, 栈帧过大会导致线程数变少
    • 栈内存溢出
      • 栈帧过多导致栈内存溢出–递归调用
      • 栈帧过大
  • 运行数据区中的方法区Method Area

    • 方法区是各个线程共享的内存区域, 主要存储类的信息, 运行时常量池, 虚拟机启动时创建, 关闭虚拟机时释放
    • 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace
    • 常量池:
      • 可以看作一场表, 虚拟机指令根据这张常量表找到要执行的类名, 方法名、参数类型、字面量等信息
      • 运行时常量池: 当类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
  • 直接内存

    • 直接内存并不属于JVM的内存结构, 不由JVM进行管理, 时虚拟机的系统内存,
    • 常见于NIO操作时, 用于数据缓冲区, 他分配回收成本较高, 但读写性能高
类加载器
  • 类加载器
    • 用于装载字节码文件(.class文件)–JVM只会运行二进制文件, 类加载器的作用就是将字节码文件加载到JVM中, 从而让Java程序能够启动起来.
    • 启动类加载器, 扩展类加载器, 应用类加载器(加载开发者自己编写的Java类), 自定义类加载器( 实现自定义类加载规则)
    • 双亲委派模型
      • 加载某一个类, 委托上一级的加载器进行加载, 如果上级加载器也有上级, 则会继续向上委托, 如果该类委托上级没有被加载, 自家在其尝试加载该类
    • 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。
    • 为了安全,保证类库API不会被修改
  • 类装载的执行过程
    • 加载
    • ->验证–格式检查, 语法检查
    • ->准备–为类变量分配内存并设置类变量初始值
    • ->解析–把类中的符号引用转换为直接引用
    • ->初始化–对类的静态变量, 静态代码块执行初始化操作
    • ->使用–JVM开始从入口方法执行用户的程序代码
    • ->卸载–当用户程序代码执行完毕后, JVM便开始销毁创建的Class对象
垃圾回收
  • 对象什么时候可以被垃圾回收

    • 引用计数法–引用次数为0时代表这个对象可回收
      • 当对象间出现了循环引用的话, 则引用计数法就会失效
    • 可达性分析算法–利用可达性分析来探索所有存活的对象
  • JVM垃圾回收算法

    • 标记清除算法
      • 标记–可达性分析算法
      • 标记就和清除速度较快, 但内存碎片化
    • 标记整理算法
      • 再标记清除算法前提下, 标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。
    • 复制算法
      • 将垃圾复制进另一块内存再清理
      • 效率较高, 内存无碎片, 内存使用率较低
  • JVM分代回收

    • 在java8时,堆被分为了两份:新生代和老年代【1:2】
      • 对于新生代,内部又被分为了三个区域。
        • 伊甸园区Eden,新生的对象都分配到这里
        • 幸存者区survivor(分成from和to)
        • Eden区,from区,to区【8:1:1】
    • 在这里插入图片描述
  • JVM垃圾回收器(老年代垃圾, 新生代垃圾)

    • 串行垃圾收集器
    • 并行垃圾收集器
    • 并发CMS垃圾收集器
      • 是一款并发的、使用标记-清除算法的垃圾回收器,
      • 该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器
    • G1垃圾收集器–作用在新生代和老年代,JDK9后默认使用G1
      • 在这里插入图片描述
  • 引用的区别

    • 强引用–只要所有 GC Roots 能找到,就不会被回收
    • 软引用–需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
    • 弱引用–需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
    • 虚引用–必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
JVM实践
  • JVM设置调优

    • 参数如何设置
      • war包部署在tomcat中设置
        • 修改TOMCAT_HOME/bin/catalina.bat文件
      • jar包部署在启动参数设置
        • java -Xms512m -Xmx1024m -jar xxxx.jar
    • 调优参数
      • 对于JVM调优,主要就是调整年轻代、老年代、元空间的内存空间大小及使用的垃圾回收器类型。
      • 设置堆空间大小
      • 虚拟机栈的设置–栈帧大小
      • 年轻代中Eden区和两个Survivor区的大小比例
      • 年轻代晋升老年代阈值设置
      • 垃圾回收收集器–吞吐量设置/收集器选择
    • 调优工具
      • 命令工具
        • jps 进程状态信息, jstack 查看java进程内线程的堆栈信息, jmap 查看堆转信息, jhat 堆转储快照分析工具,jstat 堆转储快照分析工具
      • 可视化工具
        • jsonsole 用于对jvm内存, 线程, 类的健康
        • visualVM 能够监控线程, 内存情况
  • Java内存泄露排查思路

    • 虚拟机栈–StackOverFlowError
    • 方法区–OutOfMemoryError:MetaSpace
    • 堆–OutOfMemoryError:Java heap space
    • 内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况
      • 通过jmap(程序运行时)或设置jvm参数获取堆内存快照dump
      • 通过工具VisuakVM分析dump文件(VisualVM能够分析离线dump文件)
      • 通过查看对信息的情况, 定位内存溢出的代码
      • 找到对应代码进行修复
  • CPU飙高排查方案与思路

    • 使用top命令查看占用cpu的情况
    • 查案看哪个进程占用cpu较高
    • 使用ps命令查看进程中的线程信息
      看对信息的情况, 定位内存溢出的代码
      • 找到对应代码进行修复
  • CPU飙高排查方案与思路

    • 使用top命令查看占用cpu的情况
    • 查案看哪个进程占用cpu较高
    • 使用ps命令查看进程中的线程信息
    • 使用jstack命令查看进程中哪些线程出现了问题, 最终定位问题

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

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

相关文章

什么是网关,网关的作用是什么?网络安全零基础入门到精通实战教程!

1. 什么是网关 网关又称网间连接器、协议转换器,也就是网段(局域网、广域网)关卡,不同网段中的主机不能直接通信,需要通过关卡才能进行互访,比如IP地址为192.168.31.9(子网掩码:255.255.255.0)和192.168.7.13(子网掩码…

《千恋万花》无广版手游安卓苹果免费下载直装版

自取https://pan.xunlei.com/s/VOJS77k8NDrVawqcOerQln2lA1?pwdn6k8 《千恋万花》:柚子社的和风恋爱杰作 《千恋万花》(Senren * Banka)是由日本知名美少女游戏品牌柚子社(Yuzusoft)于2016年推出的一款和风恋爱题材…

javaEE-14.spring MVC练习

目录 1.加法计算器 需求分析: 前端页面代码: 后端代码实现功能: 调整前端页面代码: 进行测试: 2.用户登录 需求分析: 定义接口: 1.登录数据校验接口: 2.查询登录用户接口: 前端代码: 后端代码: 调整前端代码: 测试/查错因 后端: 前端: lombok工具 1.引入依赖…

rabbitmq五种模式的实现——springboot

rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址:https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成 (一)Spring Boot 集成 RabbitMQ 概述 Spring Boot 提供了对 RabbitMQ 的自…

23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成

文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台(已集成 DeepSeek 大模型)1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…

Educational Codeforces Round 174 (Rated for Div. 2)(ABCD)

A. Was there an Array? 翻译: 对于整数数组 ​,我们将其相等特征定义为数组 ,其中,如果数组 a 的第 i 个元素等于其两个相邻元素,则 ;如果数组 a 的第 i 个元素不等于其至少一个相邻元素,则 …

如何在本机上模拟IP地址

如何在本机上模拟IP地址 前言 在某些开发或测试场景中,我们可能需要在本机上模拟一个指定的 IP 地址,并让局域网内的其他设备能够通过该 IP 访问本机提供的服务(如 Web 服务)。 本文将详细介绍如何在 Windows 和 macOS 系统上实…

【嵌入式Linux应用开发基础】进程间通信(1):管道

目录 一、管道的基本概念 二、管道的工作原理 三、管道的类型 3.1. 匿名管道(Anonymous Pipe) 3.2. 命名管道(Named Pipe,FIFO) 四、管道的读写规则 4.1. 匿名管道的读写规则 4.2. 命名管道的读写规则 五、管…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介:Ollama 是一个强大的开源框架,是一个为本地运行大型语言模型而设计的工具,它帮助用户快速在本地运行大模型,通过简单的安装指令,可以让用户执行一条命令就在本地运…

DHCP详解,网络安全零基础入门到精通实战教程!

一、DHCP简介 DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。 DHCP前身是BOOTP&am…

【Prometheus】prometheus结合pushgateway实现脚本运行状态监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

立创实战派ESP32-S3烧录小智AI指南

小智 AI 聊天机器人-开源项目介绍 本项目是一个开源项目,主要用于教学目的。我们希望通过这个项目,能够帮助更多人入门 AI 硬件开发,了解如何将当下飞速发展的大语言模型应用到实际的硬件设备中。无论你是对 AI 感兴趣的学生,还是…

深度学习的集装箱箱号OCR识别技术,识别率99.9%

集装箱箱号OCR识别技术是一项结合计算机视觉和规则校验的复杂任务,以下是其关键要点及实现思路的总结: 1、集装箱号结构:11位字符,格式为公司代码(3字母)和序列号(6数字)以及校验码(1数字)和尺寸/类型代码(可选),例如…

如何在Windows下使用Ollama本地部署DeepSeek R1

参考链接: 通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细) 【DeepSeek应用】DeepSeek R1 本地部署(OllamaDockerOpenWebUI) 如何将 Chatbox 连接到远程 Ollama 服务:逐步指南 首先需要安装oll…

【分布式理论12】事务协调者高可用:分布式选举算法

文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中,常常有多个节点(应用)共同处理不同的事务和资源。前文 【分布式理论9】分布式…

postgres源码学习之简单sql查询

postgres源码学习之sql查询 sql查询的主流程读取sql解析sql重写sql获得执行计划执行查询操作结果返回 sql查询的主流程 参考postgres的处理流程 由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执…

C#项目05-猜数字多线程

本项目利用多线程,通过点击按钮猜数字, 知识点 线程 基本概念 进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况, 线…

《C语言动态顺序表:从内存管理到功能实现》

1.顺序表 1.1 概念 顺序存储的线性表,叫顺序表。 1.2顺序表存放的实现方式 可以使用数组存储数据,可以实现逻辑上相连,物理内存上也相连。也可以使用malloc在堆区申请一片连续的空间,存放数据,实现逻辑上相连&#…

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考(windows 部署安装 大模型 DeepSeek-R1) 那么实际使用中需要开启API模式,这样可以无拘无束地通过API集成的方式,集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…

DeepSeek-学习与实践

1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…