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

简要:JVM底层原理、JVM各类垃圾收集器的使用及核心参数的调优、JVM 调优

目录

一、JVM底层原理

1. JVM内存结构

2. JVM与操作系统的交互

二、垃圾收集器

1. 常见的垃圾收集器

2. 垃圾收集算法

三、JVM调优

1. 调优目标

2. 调优方法

3. 核心参数调优


深入理解JVM(Java虚拟机)的底层原理,熟悉JVM各类垃圾收集器的使用及核心参数的调优,是Java开发者在性能优化和故障排查中不可或缺的技能。下面将从JVM的底层原理、垃圾收集器以及JVM调优等方面进行详细阐述。

一、JVM底层原理

1. JVM内存结构

JVM的内存结构主要包括以下几个部分:

  • 方法区(Metaspace/PermGen Space):存储编译后的类、常量等(.class字节码文件)。在JDK 8及以后,永久代(PermGen Space)被元空间(Metaspace)替代。
  • 堆内存(Heap):存储对象实例及数组。堆内存分为新生代(Young Generation)和老年代(Old Generation),新生代中进一步细分为Eden区和两个Survivor区(From和To)。
  • 程序计数器(Program Counter Register):存储当前执行的指令地址。
  • 虚拟机栈(Java Virtual Machine Stacks):存储局部变量、方法参数、返回值以及异常处理信息。每个线程都有自己独立的虚拟机栈。
  • 本地方法栈(Native Method Stacks):存储本地方法的执行状态信息。
2. JVM与操作系统的交互

JVM处于JDK的最底层,负责与操作系统的交互,提供完整的Java运行环境。操作系统通过JDK中的Java.exe来装载JVM,通过一系列步骤完成JVM环境的搭建。

二、垃圾收集器

JVM中的垃圾收集主要是针对堆内存进行的,目的是识别出已死对象并回收其占用的内存。JVM提供了多种垃圾收集器,每种收集器都有其适用场景和优缺点。

1. 常见的垃圾收集器
  • Serial收集器:最基本的收集器,进行串行收集,停止所有工作线程,以单线程方式进行堆内存的垃圾回收。适用于客户端环境。
  • Parallel收集器:吞吐量收集器,采用并行方式收集,目标是达到一个可控制的吞吐量,适用于后台批处理任务。
  • CMS(Concurrent Mark Sweep)收集器:一种并发收集器,以降低停顿时间为目标,采用标记-清除算法。适用于需要同时运行垃圾收集和用户程序的情况。
  • G1收集器:面向服务端应用的收集器,能充分利用多CPU、多核环境,是一款并行与并发收集器,能建立可预测的停顿时间模型。
2. 垃圾收集算法
  • 标记-清除(Mark-Sweep):将内存划分为若干区域,标记出存活的对象,然后清除未标记的对象。
  • 标记-整理(Mark-Compact):在标记-清除的基础上,对存活对象进行整理,去除内存碎片。
  • 复制(Copying):将内存划分为两块,每次只使用其中一块,当这块内存用完时,将存活的对象复制到另一块内存,然后清理掉已使用的内存。

三、JVM调优

1. 调优目标
  • 提高应用程序的吞吐量:通过优化JVM的内存管理、垃圾回收和线程管理等方面,减少JVM的开销。
  • 减少应用程序的延迟:通过优化JVM的垃圾回收策略、调整线程池大小等,提高用户体验。
  • 减少JVM的内存占用:通过优化JVM的内存管理策略,减少内存泄漏和OOM(Out Of Memory)等问题。
2. 调优方法
  • 选择合适的垃圾回收器:根据应用程序的特点选择合适的垃圾回收器,如客户端应用选择Serial收集器,后台批处理任务选择Parallel收集器,对停顿时间敏感的应用选择CMS或G1收集器。
  • 调整JVM内存参数:如-Xms、-Xmx、-Xmn等,控制JVM的堆内存和非堆内存大小,避免内存泄漏和OOM等问题。
  • 使用性能分析工具:如JProfiler、VisualVM、GCViewer等,对应用程序进行分析,找出瓶颈和性能问题。
  • 优化代码:避免频繁创建对象、减少方法调用次数、避免过度同步等,减少JVM的开销。
3. 核心参数调优
  • -Xms:设置JVM启动时的初始堆内存大小。
  • -Xmx:设置JVM可使用的最大堆内存大小。
  • -Xmn:设置年轻代的大小。
  • -XX:NewRatio:设置年轻代(包括Eden和两个Survivor区)与老年代的比值。
  • -XX:SurvivorRatio:设置Eden区与Survivor区的大小比值。
  • -XX:+UseG1GC:启用G1垃圾收集器。

综上所述,深入理解JVM的底层原理,熟悉各类垃圾收集器的使用及核心参数的调优,是Java开发者在提升应用性能和稳定性方面的重要技能。通过合理的JVM调优,可以显著提高Java应用程序的性能和响应能力。

参考:

深入了解JVM的底层原理_jvm底层-CSDN博客

JVM垃圾收集机制详解与性能调优(详细)_jvm 垃圾回收与调优-CSDN博客

JVM-JVM性能调优_java 11 jvm 调优-CSDN博客

深入了解JVM底层原理-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Makefile自动依赖
  • package.json的 和 的区别,以及|| 和 | 的区别
  • 告别杂音,从 AI 音频降噪开始
  • 文件上传绕过最新版安全狗
  • CENTOS9+RSYSLOG+LOGROTATE收集日志
  • AI融合新突破:CNN与Transformer的强强联合!
  • 收银系统源码—多商户平台入驻商城+门店线下收银
  • 英伟达元宇宙平台Omniverse的学习,技术调研
  • 缺失值处理方法:代数/统计/机器学习算法补全数据(附Python-sklearn代码精美可视化绘图)
  • C# 事件总线 Event Bus
  • STM32G070KBT6的RTC HAL库使用
  • FFmpeg For Android入门NDK打印版本号
  • python自动化笔记:os模块和异常处理
  • 什么是设计模式?一文理解,通俗易懂!
  • Nacos原理自问
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CentOS 7 修改主机名
  • codis proxy处理流程
  • java中的hashCode
  • js ES6 求数组的交集,并集,还有差集
  • Koa2 之文件上传下载
  • Objective-C 中关联引用的概念
  • opencv python Meanshift 和 Camshift
  • OSS Web直传 (文件图片)
  • Redis中的lru算法实现
  • Spring声明式事务管理之一:五大属性分析
  • Swift 中的尾递归和蹦床
  • tweak 支持第三方库
  • 从0实现一个tiny react(三)生命周期
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 浮动相关
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数据结构java版之冒泡排序及优化
  • 线上 python http server profile 实践
  • 一份游戏开发学习路线
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​configparser --- 配置文件解析器​
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #ifdef 的技巧用法
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)SpringCloud 整合Python
  • (2)nginx 安装、启停
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (vue)页面文件上传获取:action地址
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (接口封装)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)Docker基本介绍
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .net MySql