JVM——一个神圣的话题,可远观而不可亵玩焉

文章目录

  • 一切不仅仅为了面试
    • JVM调优理解
      • JVM调什么:
      • 怎么调:
      • 为了解决什么问题:
      • 正常情况下需要调吗:
    • JVM垃圾收集器
      • 区分垃圾
      • 收集方式
        • 垃圾收集的区域划分:
        • 按照收集垃圾的线程数量划分:
        • 对空间的利用率划分:
    • 垃圾收集器详细介绍:
    • 小结

一切不仅仅为了面试

提示:仅仅代表个人理解

JVM调优理解

JVM调优是指调整和配置JVM的参数以优化运行Java应用程序的性能,主要目标是提高应用的响应速度和提高应用的吞吐量减少延迟以及确保资源高效使用。调优通常针对内存管理垃圾收集策略线程堆栈大小等方面进行。

JVM调什么:

提示:这里我就想吐槽一下:不要没病乱吃药,同样JVM没啥问题不要乱调

分析应用的性能特征:首先需要使用诊断工具(如jConsole、VisualVM、JProfiler等)收集Java应用的运行时数据。

确定调优目标:了解应用的需求,是否关注高吞吐量、低延迟还是内存使用效率等。

选择合适的垃圾收集器:基于应用需求选择合适的垃圾收集器,如CMS、G1、ZGC等。

调整内存分配:分析并设置适当的堆内存大小、新生代和老年代的比例、元空间大小等。

调整性能参数:例如调整JIT编译器行为、线程堆栈的大小等。
(JIT是"Just-In-Time"编译器的缩写,它是一种运行时编译器)

持续测试和监控:在调整参数后,需要持续测试应用并监控其性能,以确保调优取得预期效果。

怎么调:

1、堆内存设置(比如-Xms和-Xmx参数设置初始和最大堆内存)。
2、新生代和老年代的大小比例(使用-XX:NewRatio)。
3、垃圾收集器选择和调整
(比如-XX:+UseG1GC,-XX:+UseConcMarkSweepGC)。
4、垃圾收集细节调整
(如设置线程数量-XX:ConcGCThreads,年轻代大小-XX:NewSize等)。
5、JVM堆栈大小(如-Xss设置每个线程的堆栈大小)。
6、逃逸分析和内联优化(如-XX:+DoEscapeAnalysis启用逃逸分析优化)。

为了解决什么问题:

1、减少垃圾收集的频率和暂停时间,避免影响到用户体验。
2、防止内存泄漏和内存溢出。
3、提高吞吐量,确保程序可以在短时间内处理更多的工作负载。
4、控制资源消耗,防止应用消耗过多的系统资源。

正常情况下需要调吗:

在许多情况下,JVM默认参数可以适用于标准应用程序,不需要特别的调优。
但对于有特定性能目标或在资源使用上有特定限制的重要应用程序,JVM调优是必要的。
例如,对于大规模的、内存密集型的或者要求高实时性的应用程序,经过专业调优后通常会有显著的性能改进。

总之,JVM调优是一个持续的过程,需要基于实际运行数据不断优化。快速反应的监控和分析,以及在实际运行环境中测试和验证调优效果非常重要。

JVM垃圾收集器

提示:思想,仅仅是思想

区分垃圾

在JVM中垃圾回收的第一步是确认什么是垃圾,现代主流的JVM实现主要使用可达性分析算法来识别哪些对象是垃圾。引用计数法因为循环引用等问题在Java虚拟机中并未广泛采用。

收集方式

垃圾收集的区域划分:

1、新生代(Young Generation)收集:收集新创建的对象,这些对象大多是短命的。
2、老年代(Old Generation/Tenured Space)收集:收集长时间存活的对象。
3、永久代(PermGen):在Java 8之前的版本中,存放类信息和常量。Java 8及之后,被**元空间(Metaspace)**所取代。
4、全部空间收集:也称为Full GC,会涉及新生代、老年代以及元空间(如果使用的是Java 8+版本)的收集。

按照收集垃圾的线程数量划分:

单线程收集:使用单个线程执行垃圾回收,这可能会导致较长的暂停时间,主要见于旧式或者简单的垃圾收集器中。
多线程收集:使用多个线程并发执行垃圾回收,以减少暂停时间和提高垃圾回收效率,现代垃圾收集器通常采用多线程。

对空间的利用率划分:

标记-清除(Mark-Sweep):标记所有可达对象,然后清除未被标记的对象,这种方法会产生内存碎片。
标记-整理(Mark-Compact):标记所有可达对象,然后将活动对象移向内存的一端,清理掉未被移动的部分,这种方法减少了内存碎片。
复制(Copying):将内存分为两块,每次只使用一块。垃圾收集时,将活动对象复制到未被使用的另一块内存区域,然后清除原有的那块内存区域中所有对象。

具体的垃圾收集器:每种垃圾收集器的实现通常采用多种上述策略的组合,针对不同的场景和需求进行优化,如:
1、Serial Collector:一个单线程收集器,适用于小型堆。
2、Parallel Collector:一个多线程收集器,也被称作“Throughput Collector”,适用于中到大型堆。
3、CMS (Concurrent Mark Sweep) Collector:以获取最短回收停顿时间为目标的收集器。
4、G1 (Garbage-First) Collector:适用于大型堆,期望可预测的停顿时间。
5、ZGC (Z Garbage Collector) 和 Shenandoah:为了减少停顿时间到极致而设计的收集器,它们使用了不同的技术实现极低的停顿时间。

垃圾收集器详细介绍:

新生代收集器:

  1. Serial收集器:

    • 算法:复制算法
    • 优点:简单高效,适用于单线程小型应用
    • 缺点:停顿时间较长
    • 默认区域:新生代
  2. ParNew收集器:

    • 算法:复制算法
    • 优点:多线程并行收集,适用于多核CPU环境
    • 缺点:停顿时间较长
    • 默认区域:新生代

老年代收集器:

  1. Serial Old收集器:

    • 算法:标记-整理算法
    • 优点:简单高效,适用于单线程小型应用
    • 缺点:停顿时间较长
    • 默认区域:老年代
  2. Parallel Old收集器:

    • 算法:标记-整理算法
    • 优点:多线程并行收集,适用于多核CPU环境
    • 缺点:停顿时间较长
    • 默认区域:老年代

整堆收集器:

  1. CMS (Concurrent Mark Sweep)收集器:

    • 算法:标记-清除算法
    • 优点:并发收集,停顿时间短
    • 缺点:产生碎片,无法处理浮动垃圾,CPU资源敏感
    • 默认区域:老年代
    • JDK版本:JDK 1.4至JDK 8
  2. G1 (Garbage-First)收集器:

    • 算法:分代收集算法,包括复制算法和标记-整理算法
    • 优点:整体吞吐量高,可控制停顿时间
    • 缺点:运行时开销较大
    • 默认区域:整个堆空间
    • JDK版本:JDK 9及以后

其他收集器:

  1. Shenandoah收集器:

    • 算法:并发标记-压缩算法
    • 优点:极低的停顿时间,适用于大堆、低延迟的应用
    • 缺点:运行时开销较大
    • 默认区域:整个堆空间
    • JDK版本:JDK 12及以后
  2. ZGC (Z Garbage Collector)收集器:

    • 算法:并发压缩算法
    • 优点:极短的停顿时间,适用于大堆、低延迟的应用
    • 缺点:运行时开销较大
    • 默认区域:整个堆空间
    • JDK版本:JDK 11及以后

小结

提示:未完成
这个文章其实并未完成,这里还有一些关于JVM中的数据怎么去可视化,怎么去分析数据性能,异常之后怎么去操作如:OOM之后等等
后续会补上。并在完善当前文章

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

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

相关文章

图数据库 之 Neo4j - 图数据库基础(2)

图数据库是一种专门用于存储、管理和查询图数据的数据库。与传统的关系型数据库不同,图数据库以图的形式存储数据,其中节点表示实体,边表示实体之间的关系。这种图数据模型非常适合表示复杂的关系和连接。 图数据库的定义和特点 图数据库是一…

数据结构第九天(堆排序)

目录 前言 概述 源码: 主函数: 运行结果: 其他 前言 哈哈,这个堆排序算法很久之前就已经敲过一遍了,时间一久,思路有点淡忘。今天重新看过一遍之后,又亲自撸代码,幸运的是&am…

联合索引之最左匹配原则

一、定义: 联合索引中,从最左边的字段开始匹配,若条件中字段在联合索引中符合从左到右的顺序则走索引,否则不走,可以简单理解为(a, b, c)的联合索引相当于创建了a索引、(a, b)索引和(a, b, c)索引。同时遇到范围查询&…

设计模式(行为型模式)责任链模式

目录 一、简介二、责任链模式2.1、处理器接口2.2、具体处理器类2.3、使用 三、优点与缺点 一、简介 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理…

【MATLAB源码-第137期】基于matlab的NOMA系统和OFDMA系统对比仿真。

操作环境: MATLAB 2022a 1、算法描述 NOMA(非正交多址)和OFDMA(正交频分多址)是两种流行的无线通信技术,广泛应用于现代移动通信系统中,如4G、5G和未来的6G网络。它们的设计目标是提高频谱效…

如何使用C#调用LabVIEW算法

新建一个工程 这是必须的; 创建项目 项目 点击完成; 将项目另存为;方便后续的使用; 创建 一个测试VI 功能很简单,用的一个加法;将加数A,B设置为输入,和C设置为输出,…

正点原子--STM32通用定时器学习笔记(2)

1. 通用定时器输入捕获部分框图介绍 捕获/比较通道的输入部分(通道1) 输入通道映射CC1S[1:0]→采样频率CKD[1:0]→滤波方式IC1F[3:0]→边沿检测方式CC1P→捕获分频ICPS[1:0]→使能捕获CC1E 输入部分对相应的TIx输入信号采样,并产生一个滤波后…

MPLS——多协议标签交换

目录 1 多协议标签交换 MPLS 1.1 MPLS 的工作原理 1.1.1 MPLS 工作特点 1.1.2 MPLS 协议的基本原理 1.1.3 MPLS 的基本工作过程 1.2 转发等价类 FEC 1.2.1 FEC 用于负载平衡 1.3 MPLS 首部的位置与格式 1.3.1 MPLS 首部的位置 1.3.2 MPLS 首部的格式 1.4 新一代的…

STM32 HAL NTC(3950 10k)查表法

NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制…

vue项目开发vscode配置

配置代码片段 步骤如下: 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例,配置具体代码片段 {"name": "vue-sph","version": "…

modelsim仿真使用到vivado的IP,该如何使用!

modelsim仿真时,如果使用到了vivado的IP就会报错,本次就告诉大家如何将vivado的IP添加到modelsim中直接仿真。 一、生成ini文件以及IP打包 打开vivado,点击上方的Tools-->Compile Simulation Libraries得到如下界面 simulator&#xff1…

【Python基础】案例分析:泰坦尼克分析

泰坦尼克分析 1 目的: 熟悉数据集熟悉seaborn各种操作作 import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt %matplotlib inline home rdata df sns.load_dataset(titanic, data_homehome) df.head()survivedpcl…

#P12365. 相逢是首歌

Description monkey A与monkey B住在一颗树上,每天他们都会相约一起出去玩。 q次询问,每次询问给两个点x和y,代表他们各自的出发点,他们以相同的速度,沿着二者的最短路前进. 问二者会在点上相遇,还是在边…

mmdetection使用自己的voc数据集训练模型实战

一.自己数据集整理 将labelimg格式数据集进行整理 1.1. 更换图片后缀为jpg import os import shutilroot_path/media/ai-developer/imgfileos.listdir(root_path)for img in file:if img.endswith(jpeg) or img.endswith(JPG) or img.endswith(png):img_pathos.path.join(root…

理想汽车学华为,年终奖红包有点大(含算法原题)

理想年终奖红包 2月5日,有微博用户发帖称,脉脉上看到,今年理想汽车的年终奖红包有点大。 对此,李想转发并评论: ❝ 不能只学华为的流程,而不学华为的利益分配。奖罚不分明,是组织低效的最大原因…

C++ lambda [],[=] ,[],[this] 的使用

在c11标准中引入了lambda表达式,一般用于定义匿名函数 [],[] ,[&],[this] 都是捕获列表 [] 的作用: 什么也不捕获 [] 的作用: 按值捕获所有变量 [&] 的作用: 引用捕获所有外部作用域内的变量 [this]的作用&#xf…

怎么理解 Redis 事务

背景 在面试中经常会被问到,redis支持事务吗?事务是怎么实现的?事务会回滚吗?又是一键三连,我下面分析下,看看能不能吊打面试官 什么是Redis事务 事务是一个单独的隔离操作:事务中的所有命令…

【SpinalHDL】1. Getting Started

1. Getting Started 1.1 SpinalHDL开发环境的搭建 开发环境的搭建参考SpinalHDL 开发环境搭建一步到位(图文版) - 极术社区 - 连接开发者与智能计算生态就可以了,so detail. 重点在于sbt切换为国内源,可以参考如下链接Windows上…

企业为什么选择SASE?香港电讯专家给你答案!

2019年,Gartner发布了全新的网络安全模型:安全访问服务边缘(Secure Access Service Edge, SASE),并预测到2025年80%的企业将使用SASE/SSE架构统一网络、云服务和私人应用程序的安全访问。那么企业为什么选择SASE&#…

Web课程学习笔记--CSS-Position学习

CSS Position学习 CSS Position有四个属性&#xff1a; relativeabsolutefixedstatic&#xff08;默认&#xff09; 样例 <div id"parent"><div id"sub1">sub1</div><div id"sub2">sub2</div> </div>su…