JVM专题十三:总结与整理(持续更新)
图解JVM
JVM与Java体系结构

JVM垃圾回收算法

JVM垃圾回收器

图解JVM主要是放了前面12个章节的我们给大家画的图,做了整体的汇总,大家可以根据图区回忆我们所说的内容,查缺补漏。
实战经验
1、项目中数据量多少,QPS与TPS最高多少、服务器配置怎样的?
我们项目根据不同服务数据不一样,之前待在某互联网保险公司有2kw最有的活跃用户,我们的核心服务是4核8g,峰值QPS 4-5000,tps-3-400
2、项目中如何选择垃圾回收器?为什么?
决策树基于处理器核心数、吞吐量需求、内存大小、JDK版本来推荐合适的Java垃圾回收器。一般有一下套路:
-
吞吐量优先:如果应用程序更在意吞吐量,选择Parallel垃圾回收器。
-
内存小于4G&JDK版本8:如果应用程序的内存需求小于4GB或者JDK8是*,选择CMS垃圾回收器。
-
JDK版本大于8小于11:选择G1垃圾回收器。
-
JDK版本大于12:如果使用的JDK版本大于或等于12,选择Shenandoah垃圾回收器。
但是任何套路的问题都不适用于所有场景,只是提供一个思路,主要还是要了解各个回收器的优缺点,然后根据自己项目的实际情况去设置。
3、会看GC日志吗,重点看那些参数
-
GC日志: 这是Java虚拟机执行垃圾回收操作时的日志输出,帮助开发者了解内存使用情况和回收效率。
-
Allocation Failure: 表示JVM尝试分配内存失败,这可能意味着内存不足。
-
ParNew (promotion failed): 这是ParNew收集器的日志,用于新生代的垃圾回收。日志显示从7260K到7970K的内存使用,回收操作耗时0.0048975秒。
-
CMS: 表示并发标记清除(Concurrent Mark-Sweep)收集器的操作,用于老年代的垃圾回收。日志显示从8194K减少到6836K的内存使用,耗时0.0049920秒。
-
Heap: 表示JVM堆内存的配置和使用情况。
-
Par New Generation: 新生代内存,总大小9216K,已使用2130K。包括Eden区、From Space和To Space。
-
Concurrent Mark-Sweep Generation: 老年代内存,如模拟:总大小10240K,已使用6836K。
-
Metaspace: 表示元空间内存的使用情况,用于存储类元数据。
-
Class Space: 类空间内存,用于存储静态类型信息。
-
Times: 显示了用户时间、系统时间和实际时间的消耗
4、知道常用linux调试排错命令吗
在Linux系统中,使用命令行工具进行问题排查是一种常见的做法。下面是一些常用的命令及其用途,这些命令可以帮助你进行Java问题的排查:
grep: 用于文本搜索,可以快速查找包含特定文本的行。
- 例子:
grep "Error" log.txt查找包含"Error"的行。awk: 强大的文本处理工具,用于分析和处理文本文件。
- 例子:
awk '/Error/ {print $1, $2}' log.txt打印包含"Error"行的前两列。sed: 用于对文件进行编辑,可以执行查找和替换操作。
- 例子:
sed 's/Error/WARNING/' log.txt > new_log.txt将所有"Error"替换为"WARNING"并输出到新文件。tail: 显示文件的最后几行,常用于查看日志文件的最新内容。
- 例子:
tail -f log.txt实时查看日志文件的更新。find: 用于在文件系统中查找文件。
- 例子:
find / -name "*.log"查找系统中所有以.log结尾的文件。netstat: 查看网络连接和端口使用情况。
- 例子:
netstat -tuln查看所有TCP和UDP端口的使用情况。iptables: 查看防火墙设置。
- 例子:
iptables -L列出所有防火墙规则。route 或 ip route: 查看路由表。
- 例子:
route -n或ip route显示路由表。top: 实时显示系统进程和资源使用情况。
- 例子:
top显示实时的进程和资源使用情况。free: 查看内存使用情况。
- 例子:
free -m以MB为单位显示内存使用情况。df: 查看磁盘空间使用情况。
- 例子:
df -h以易读的格式显示磁盘使用情况。du: 查看目录或文件的大小。
- 例子:
du -sh /path/to/directory显示指定目录的大小。vmstat: 查看虚拟内存和系统负载情况。
- 例子:
vmstat 1每秒显示一次系统状态。lsblk: 查看所有块设备,即硬盘和分区。
- 例子:
lsblk列出所有块设备。swapon: 查看所有交换分区的使用情况。
- 例子:
swapon -s显示交换分区的使用情况。fdisk 或 parted: 查看硬盘分区情况。
- 例子:
fdisk -l或parted -l显示所有硬盘和分区。last: 查看用户登录日志。
- 例子:
last显示用户登录记录。who: 查看当前活动用户。
- 例子:
who显示当前登录的用户。w: 查看用户活动和系统负载。
- 例子:
w显示当前登录用户和他们正在执行的命令。ps: 查看当前运行的进程。
- 例子:
ps aux显示所有进程及其详细信息。systemctl: 查看和管理系统服务。
- 例子:
systemctl status apache2查看apache2服务的状态。lsmod: 查看已加载的内核模块。
- 例子:
lsmod列出所有已加载的模块。dmesg: 查看或分析内核消息。
- 例子:
dmesg | grep -i error查找内核消息中的"Error"。tsar: 一个系统性能监控工具,可以查看系统、设备和环境信息。
- 例子:
tsar显示系统性能监控数据。使用这些工具可以帮助你诊断和解决Java应用程序在Linux系统上的问题。记得根据具体情况选择合适的命令和参数。
5、聊完linux常用命令,你知道Java有哪些常用排查问题的工具和命令吗
在Java问题排查和调试中,有一系列工具可以帮助开发者快速定位问题并进行修复。以下是一些常用的Java调试工具列表,以及它们的简要说明:
Java调试入门工具
-
jps: 显示Java虚拟机进程状态,类似于
ps -ef | grep java。- 用法示例:
jps -l显示Java进程的本地虚拟机标识符和主类名称。
- 用法示例:
-
jstack: 打印Java线程的堆栈跟踪,帮助分析线程状态。
- 用法示例:
jstack <pid>打印指定进程ID的线程堆栈。
- 用法示例:
-
jinfo: 显示Java配置信息,或动态地修改某些JVM参数。
- 用法示例:
jinfo -flags <pid>显示指定进程的JVM启动参数。
- 用法示例:
-
jmap: 生成堆转储快照,用于分析内存使用情况。
- 用法示例:
jmap -heap <pid>打印指定进程的堆内存使用情况。
- 用法示例:
-
jstat: 用于监控JVM的性能计数器。
- 用法示例:
jstat -gcutil <pid>显示指定进程的垃圾收集统计信息。
- 用法示例:
-
jdb: Java调试器,用于调试Java应用程序。
- 用法示例:
jdb -classpath <path> <class>启动JDB并连接到指定类。
- 用法示例:
-
CHLSDB: 用于分析和调试C/C++和Java混合应用程序。
-
VisualVM: 一个图形界面的JVM监控和分析工具。
Java调试进阶工具
-
btrace: 动态追踪Java应用程序的工具,可以在不重启应用的情况下添加追踪点。
-
Greys: 一个动态追踪工具,可以运行时查看Java应用程序的内部状态。
-
Arthas: 阿里巴巴开源的Java在线诊断工具。
-
javOSize: 用于分析Java堆对象的大小。
-
JProfiler: 一个商业性能分析工具,提供CPU、内存、线程和数据库分析功能。
目前大部分都是使用的Arthas,这个工具我们后面可以单独说下,这里简单给出常用的命令
Arthas 是一个由阿里巴巴开发并开源的Java诊断工具,它可以帮助开发者在生产环境中排查各种Java应用的性能问题。以下是Arthas提供的命令集及其简要说明:
JVM相关信息
- dashboard: 显示当前系统的实时数据面板,包括CPU使用率、内存使用情况、GC情况等。
- thread: 显示当前JVM的线程堆栈信息,可以查看线程状态和锁信息。
- jvm: 显示当前JVM的信息,包括JVM参数、启动类路径等。
- sysprop: 查看和修改JVM的系统属性。
- sysenv: 查看JVM的环境变量。
- vmoption: 查看和修改JVM的诊断相关选项。
日志和属性
- logger: 查看和修改JVM的日志配置。
- getstatic: 查看类的静态属性值。
- ognl: 执行OGNL表达式,用于动态访问Java对象的属性和方法。
MBean信息
- mbean: 查看JVM的MBean信息,可以用于监控和管理JVM的运行时信息。
堆内存分析
- heapdump: 执行Java堆内存Dump,类似于jmap命令的heap dump功能,用于分析内存泄漏问题。
类和类加载器
- sc: 查看JVM已加载的类信息,包括类名、类加载器、状态等。
- sm: 查看已加载类的方法信息,包括方法名、参数、返回值等。
- jad: 反编译指定已加载类的源码,便于查看和分析。
- mc: 在内存中编译.java文件为.class文件。
- redefine: 加载外部的.class文件,并重新定义到JVM中,实现热更新。
- dump: Dump已加载类的字节码到特定目录,用于分析类定义。
- classloader: 查看类加载器的继承树、URLs、类加载信息等。
使用Arthas可以帮助开发者在不重启应用的情况下,实时地对JVM进行监控和诊断。通过这些命令,开发者可以快速定位问题,优化应用性能。如果你需要更详细的使用说明或参数选项,可以在Arthas的命令行界面中输入命令名后跟
-h参数(例如thread -h),以获取帮助信息。
6、谈完基础命令,根据这些命令我们常使用的调优参数有哪些?
关键的JVM内存参数及其说明:
-
-Xms: 设置JVM启动时的初始堆大小。这个值决定了JVM启动时分配的最小内存量。
-
-Xmx: 设置JVM可以使用的最大堆大小。这个值决定了JVM在运行时能够使用的最大内存量。
-
-Xmn: 设置新生代的大小。新生代是JVM堆中用于存放新创建对象的区域。
-
-Xss: 设置每个线程的栈大小。JDK 5及以上版本默认为1MB,之前的版本默认为256KB。
-
-XX:NewRatio: 设置新生代与老年代的比值。例如,
-XX:NewRatio=4表示新生代占堆的1/5。 -
-XX:PermSize: 设置持久代(PermGen)的初始大小。持久代用于存储类的元数据。
-
-XX:MaxPermSize: 设置持久代的最大大小。
-
-XX:MaxTenuringThreshold: 设置新生代中对象在被移动到老年代之前可以经历的最大GC次数。
-
-XX:SurvivorRatio: 设置Eden区与Survivor区的大小比值。
-
-XX:+UseFastAccessorMethods: 启用快速访问方法,优化原始类型访问。
-
-XX:+AggressiveOpts: 启用编译器的激进优化选项。
-
-XX:PretenureSizeThreshold: 设置对象超过此大小时直接在老年代中分配。
-
StackOverflowError: 当线程请求的栈深度超过最大可用深度时抛出。
-
OutOfMemoryError: 当JVM没有足够的内存空间来创建新线程时抛出。
经验建议:
- -Xms 和 -Xmx 通常设置为相同的值,以避免JVM在运行时动态调整堆大小,减少性能开销。
- -Xmn 的设置需要根据应用的内存需求和垃圾回收行为来调整。太小会增加Minor GC的频率,太大会减少老年代的大小。
- -XX:SurvivorRatio 和 -XX:TargetSurvivorRatio 的设置会影响对象在新生代中的存活时间和晋升到老年代的条件。
- 对于持久代的大小,如果应用中有很多动态类加载,可能需要增加 -XX:MaxPermSize 的值。但是,如果经常出现方法区溢出,应该考虑优化代码,减少动态类生成。
这些参数的设置需要根据具体的应用场景和性能测试结果来调整,以确保应用程序既稳定又高效地运行。
专题汇总
JVM专题一:深入分析Java工作机制
JVM专题二:Java如何进行编译的
JVM专题三:Java代码如何运行
JVM专题四:JVM的类加载机制
JVM专题五:类加载器与双亲委派机制
JVM专题六:JVM的内存模型
JVM专题七:JVM垃圾回收机制
JVM专题八:JVM如何判断可回收对象
JVM专题九:JVM分代知识点梳理
JVM专题十:JVM中的垃圾回收机制
JVM专题十一:JVM 中的收集器一
JVM专题十二:JVM 中的收集器二
JVM专题十三:总结与整理(面试常用)
相关文章:
JVM专题十三:总结与整理(持续更新)
图解JVM JVM与Java体系结构 JVM垃圾回收算法 JVM垃圾回收器 图解JVM主要是放了前面12个章节的我们给大家画的图,做了整体的汇总,大家可以根据图区回忆我们所说的内容,查缺补漏。 实战经验 1、项目中数据量多少,QPS与TPS最高多少…...
MobPush iOS端海外推送最佳实现
推送注册 在AppDelegate里进行SDK初始化(也可以在Info.plist文件中进行AppKey,AppSecret的配置)并对通知功能进行注册以及设置推送的环境和切换海外服务器等,参考如下步骤代码: <span style"background-colo…...
商家团购app微信小程序模板
手机微信商家团购小程序页面,商家订餐外卖小程序前端模板下载。包含:团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板...
探索AudioLM:音频生成技术的未来
目录 2. AudioLM的基础理论 2.1. 音频生成的基本概念 2.2. 语言模型在音频生成中的应用 2.3. 深度学习在音频生成中的作用 3. AudioLM的架构与实现 3.1. AudioLM的基本架构 3.1.1 编码器 3.1.2 解码器 3.1.3 生成模块 3.2. 训练过程 3.2.1 数据预处理 3.2.2 损失函…...
计算机视觉:深入了解图像分类、目标检测和图像分割的核心技术
计算机视觉是什么? 计算机视觉是一门致力于让计算机“看懂”图像和视频的技术,它旨在通过模拟人类视觉系统来理解和解释数字化视觉信息。这一领域涉及图像的获取、处理、分析和理解,最终用于从视觉数据中提取有用信息并做出决策。计算机视觉的…...
Django 安装 Zinnia 后出现故障
在Django中安装和配置Zinnia时遇到故障可能有多种原因,通常包括版本兼容性、依赖关系或配置问题。这里提供一些常见的解决方法和调试步骤,帮助大家解决问题。 首先,确保您安装的Zinnia版本与Django版本兼容。查看Zinnia的官方文档或GitHub页…...
.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作
一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 (1)判断bucket是否存在 (2)新建bucket (…...
Three.js机器人与星系动态场景:实现3D渲染与交互式控制
内容摘要:使用Three.js库构建了一个交互式的3D场景。组件中创建了一个机器人模型,包括头部、眼睛、触角、身体和四肢,以及两个相同的机器人实例以实现动态效果。场景中还加入了粒子效果,模拟星系环境,增强了视觉效果。…...
Android系统集成和使用FFmpeg
文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…...
水果商城外卖微信小程序模板
手机微信水果外卖,水果电商,水果商城网页小程序模板。包含:主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板...
【前端】面试八股文——输入URL到页面展示的过程
【前端】面试八股文——输入URL到页面展示的过程 1. DNS解析 当用户在浏览器中输入URL并按下回车时,首先需要将域名转换为IP地址,这个过程称为DNS(域名系统)解析。具体步骤如下: 浏览器缓存:浏览器首先检…...
什么是应用安全态势管理 (ASPM):综合指南
软件开发在不断发展,应用程序安全也必须随之发展。 传统的应用程序安全解决方案无法跟上当今开发人员的工作方式或攻击者的工作方式。 我们需要一种新的应用程序安全方法,而ASPM在该方法中发挥着关键作用。 什么是 ASPM? 应用程序安全…...
认识100种电路之耦合电路
在电子电路的世界中,耦合电路宛如一座精巧的桥梁,连接着各个功能模块,发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中,不同的电路模块往往需要协同工作,以实现特定的功能。然而,这些模…...
c++【入门】三数的乘积
限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 你已经学了一些程序的输入,这次,你需要在没有老师的任何帮助下完成这次的任务啦。这次任务,我们要读入三个整数,并且计算它们的乘积。 这是一个非常简单的题目,意在…...
C++实现简化版Qt的QObject(4):增加简单实用的事件机制
前面的文章已经实现了许多QObject的功能了: C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制(2):增加内存安全保障 C实现简化版Qt的QObject(3):增加父子关系、属性系统 但是,…...
JTracker IDEA 中最好的 MyBatis 日志格式化插件
前言 如果你使用 MyBatis ORM 框架,那么你应该用过 MyBatis Log 格式化插件,它可以让我们的程序输出的日志更人性化。 但是有一个问题,通常我们只能看到格式化后的效果,没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…...
物联网工业级网关解决方案 工业4G路由器助力智慧生活
随着科技的飞速发展,无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代,一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能,助力我们步入智慧新纪元。 一、快速转化&…...
IoTDB Committer+Ratis PMC Member:“两全其美”的秘诀是?
IoTDB & Ratis 双向深耕! 还记得一年前我们采访过拥有 IoTDB 核心研发 Ratis Committer “双重身份”的社区成员宋子阳吗?(点此阅读) 我们高兴地发现,一年后,他在两个项目都更进一步,已成为…...
【链表】- 移除链表元素
1. 对应力扣题目连接 移除链表元素 2. 实现案例代码 public class RemoveLinkedListElements {public static void main(String[] args) {// 示例 1ListNode head1 new ListNode(1, new ListNode(2, new ListNode(6, new ListNode(3, new ListNode(4, new ListNode(5, new …...
云原生之使用Docker部署RabbitMQ消息中间件
云原生之使用Docker部署RabbitMQ消息中间件 一、RabbitMQ介绍1.1 RabbitMQ简介1.2 RabbitMQ特点1.3 RabbitMQ使用场景 二、检查Docker环境2.1 检查Docker版本2.2 检查操作系统版本2.3 检查Docker状态 三、下载RabbitMQ镜像四、部署RabbitMQ服务4.1创建挂载目录4.2 运行RabbitMQ…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
