JVM专题十三:总结与整理(持续更新)

图解JVM

JVM与Java体系结构

JVM垃圾回收算法

JVM垃圾回收器

图解JVM主要是放了前面12个章节的我们给大家画的图,做了整体的汇总,大家可以根据图区回忆我们所说的内容,查缺补漏。

实战经验

1、项目中数据量多少,QPS与TPS最高多少、服务器配置怎样的?

我们项目根据不同服务数据不一样,之前待在某互联网保险公司有2kw最有的活跃用户,我们的核心服务是4核8g,峰值QPS 4-5000,tps-3-400

2、项目中如何选择垃圾回收器?为什么?


决策树基于处理器核心数、吞吐量需求、内存大小、JDK版本来推荐合适的Java垃圾回收器。一般有一下套路:

  1. 吞吐量优先:如果应用程序更在意吞吐量,选择Parallel垃圾回收器。

  2. 内存小于4G&JDK版本8:如果应用程序的内存需求小于4GB或者JDK8是*,选择CMS垃圾回收器。

  3. JDK版本大于8小于11:选择G1垃圾回收器。

  4. JDK版本大于12:如果使用的JDK版本大于或等于12,选择Shenandoah垃圾回收器。

但是任何套路的问题都不适用于所有场景,只是提供一个思路,主要还是要了解各个回收器的优缺点,然后根据自己项目的实际情况去设置。

3、会看GC日志吗,重点看那些参数

  1. GC日志: 这是Java虚拟机执行垃圾回收操作时的日志输出,帮助开发者了解内存使用情况和回收效率。

  2. Allocation Failure: 表示JVM尝试分配内存失败,这可能意味着内存不足。

  3. ParNew (promotion failed): 这是ParNew收集器的日志,用于新生代的垃圾回收。日志显示从7260K到7970K的内存使用,回收操作耗时0.0048975秒。

  4. CMS: 表示并发标记清除(Concurrent Mark-Sweep)收集器的操作,用于老年代的垃圾回收。日志显示从8194K减少到6836K的内存使用,耗时0.0049920秒。

  5. Heap: 表示JVM堆内存的配置和使用情况。

  6. Par New Generation: 新生代内存,总大小9216K,已使用2130K。包括Eden区、From Space和To Space。

  7. Concurrent Mark-Sweep Generation: 老年代内存,如模拟:总大小10240K,已使用6836K。

  8. Metaspace: 表示元空间内存的使用情况,用于存储类元数据。

  9. Class Space: 类空间内存,用于存储静态类型信息。

  10. Times: 显示了用户时间、系统时间和实际时间的消耗

4、知道常用linux调试排错命令吗

在Linux系统中,使用命令行工具进行问题排查是一种常见的做法。下面是一些常用的命令及其用途,这些命令可以帮助你进行Java问题的排查:

  1. grep: 用于文本搜索,可以快速查找包含特定文本的行。

    • 例子:grep "Error" log.txt 查找包含"Error"的行。
  2. awk: 强大的文本处理工具,用于分析和处理文本文件。

    • 例子:awk '/Error/ {print $1, $2}' log.txt 打印包含"Error"行的前两列。
  3. sed: 用于对文件进行编辑,可以执行查找和替换操作。

    • 例子:sed 's/Error/WARNING/' log.txt > new_log.txt 将所有"Error"替换为"WARNING"并输出到新文件。
  4. tail: 显示文件的最后几行,常用于查看日志文件的最新内容。

    • 例子:tail -f log.txt 实时查看日志文件的更新。
  5. find: 用于在文件系统中查找文件。

    • 例子:find / -name "*.log" 查找系统中所有以.log结尾的文件。
  6. netstat: 查看网络连接和端口使用情况。

    • 例子:netstat -tuln 查看所有TCP和UDP端口的使用情况。
  7. iptables: 查看防火墙设置。

    • 例子:iptables -L 列出所有防火墙规则。
  8. routeip route: 查看路由表。

    • 例子:route -n 或 ip route 显示路由表。
  9. top: 实时显示系统进程和资源使用情况。

    • 例子:top 显示实时的进程和资源使用情况。
  10. free: 查看内存使用情况。

    • 例子:free -m 以MB为单位显示内存使用情况。
  11. df: 查看磁盘空间使用情况。

    • 例子:df -h 以易读的格式显示磁盘使用情况。
  12. du: 查看目录或文件的大小。

    • 例子:du -sh /path/to/directory 显示指定目录的大小。
  13. vmstat: 查看虚拟内存和系统负载情况。

    • 例子:vmstat 1 每秒显示一次系统状态。
  14. lsblk: 查看所有块设备,即硬盘和分区。

    • 例子:lsblk 列出所有块设备。
  15. swapon: 查看所有交换分区的使用情况。

    • 例子:swapon -s 显示交换分区的使用情况。
  16. fdiskparted: 查看硬盘分区情况。

    • 例子:fdisk -l 或 parted -l 显示所有硬盘和分区。
  17. last: 查看用户登录日志。

    • 例子:last 显示用户登录记录。
  18. who: 查看当前活动用户。

    • 例子:who 显示当前登录的用户。
  19. w: 查看用户活动和系统负载。

    • 例子:w 显示当前登录用户和他们正在执行的命令。
  20. ps: 查看当前运行的进程。

    • 例子:ps aux 显示所有进程及其详细信息。
  21. systemctl: 查看和管理系统服务。

    • 例子:systemctl status apache2 查看apache2服务的状态。
  22. lsmod: 查看已加载的内核模块。

    • 例子:lsmod 列出所有已加载的模块。
  23. dmesg: 查看或分析内核消息。

    • 例子:dmesg | grep -i error 查找内核消息中的"Error"。
  24. tsar: 一个系统性能监控工具,可以查看系统、设备和环境信息。

    • 例子:tsar 显示系统性能监控数据。

使用这些工具可以帮助你诊断和解决Java应用程序在Linux系统上的问题。记得根据具体情况选择合适的命令和参数。

5、聊完linux常用命令,你知道Java有哪些常用排查问题的工具和命令吗

在Java问题排查和调试中,有一系列工具可以帮助开发者快速定位问题并进行修复。以下是一些常用的Java调试工具列表,以及它们的简要说明:

Java调试入门工具

  1. jps: 显示Java虚拟机进程状态,类似于ps -ef | grep java

    • 用法示例:jps -l 显示Java进程的本地虚拟机标识符和主类名称。
  2. jstack: 打印Java线程的堆栈跟踪,帮助分析线程状态。

    • 用法示例:jstack <pid> 打印指定进程ID的线程堆栈。
  3. jinfo: 显示Java配置信息,或动态地修改某些JVM参数。

    • 用法示例:jinfo -flags <pid> 显示指定进程的JVM启动参数。
  4. jmap: 生成堆转储快照,用于分析内存使用情况。

    • 用法示例:jmap -heap <pid> 打印指定进程的堆内存使用情况。
  5. jstat: 用于监控JVM的性能计数器。

    • 用法示例:jstat -gcutil <pid> 显示指定进程的垃圾收集统计信息。
  6. jdb: Java调试器,用于调试Java应用程序。

    • 用法示例:jdb -classpath <path> <class> 启动JDB并连接到指定类。
  7. CHLSDB: 用于分析和调试C/C++和Java混合应用程序。

  8. VisualVM: 一个图形界面的JVM监控和分析工具。

Java调试进阶工具

  1. btrace: 动态追踪Java应用程序的工具,可以在不重启应用的情况下添加追踪点。

  2. Greys: 一个动态追踪工具,可以运行时查看Java应用程序的内部状态。

  3. Arthas: 阿里巴巴开源的Java在线诊断工具。

  4. javOSize: 用于分析Java堆对象的大小。

  5. 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内存参数及其说明:

  1. -Xms: 设置JVM启动时的初始堆大小。这个值决定了JVM启动时分配的最小内存量。

  2. -Xmx: 设置JVM可以使用的最大堆大小。这个值决定了JVM在运行时能够使用的最大内存量。

  3. -Xmn: 设置新生代的大小。新生代是JVM堆中用于存放新创建对象的区域。

  4. -Xss: 设置每个线程的栈大小。JDK 5及以上版本默认为1MB,之前的版本默认为256KB。

  5. -XX:NewRatio: 设置新生代与老年代的比值。例如,-XX:NewRatio=4 表示新生代占堆的1/5。

  6. -XX:PermSize: 设置持久代(PermGen)的初始大小。持久代用于存储类的元数据。

  7. -XX:MaxPermSize: 设置持久代的最大大小。

  8. -XX:MaxTenuringThreshold: 设置新生代中对象在被移动到老年代之前可以经历的最大GC次数。

  9. -XX:SurvivorRatio: 设置Eden区与Survivor区的大小比值。

  10. -XX:+UseFastAccessorMethods: 启用快速访问方法,优化原始类型访问。

  11. -XX:+AggressiveOpts: 启用编译器的激进优化选项。

  12. -XX:PretenureSizeThreshold: 设置对象超过此大小时直接在老年代中分配。

  13. StackOverflowError: 当线程请求的栈深度超过最大可用深度时抛出。

  14. 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专题十三:总结与整理(面试常用)

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

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

相关文章

充电站,正在杀死加油站

最近&#xff0c;深圳公布了一组数据&#xff0c;深圳的超级充电站数量已超过传统加油站数量&#xff0c;充电枪数量也已超过加油枪数量。 从全国范围看&#xff0c;加油站关停的速度在加快。 充电站正在杀死加油站。 加油站&#xff0c;未来何去何从&#xff1f; 01. 减少 我…

FFmpeg教程-二-代码实现录音

目录 一&#xff0c;实现步骤 二&#xff0c;具体实现 1&#xff0c;注册设备 2&#xff0c;获取输入格式对象 3&#xff0c;打开设备 4&#xff0c;采集数据 一&#xff0c;实现步骤 二&#xff0c;具体实现 1&#xff0c;注册设备 // 初始化libavdevice并注册所有输入…

操作系统-中断和异常

中断和异常 用户态&#xff1a;普通应用程序运行在用户态&#xff0c;有很多权限限制 内核态&#xff1a;操作系统运行在内核态&#xff0c;有完全的权限访问和管理所有资源&#xff08;硬件&#xff0c;内存&#xff09; 中断的作用 把CPU从用户态变内核态 异常&#xff08…

C++ 教程 - 07 类的静态成员

文章目录 静态成员 静态成员 使用static修饰的成员&#xff1b; 静态的成员变量&#xff1b; 仅保留一份副本&#xff0c;不管创建多少个实例对象&#xff0c;都共享这一份数据&#xff1b;类、对象均可以调用&#xff1b;类外重新声明&#xff0c;并通过类初始化&#xff1b;…

C语言:哈希表

1、文章声明&#xff1a; 本文是基于链地址法建立的哈希表。文章中若存在错误&#xff0c;欢迎各路大佬指正。本文涉及二级指针&#xff0c;链表等内容。该方面的知识点&#xff0c;可以参考文章&#xff1a; 数据结构&#xff1a;单链表的相关操作-CSDN博客 C语言&#xff…

什么是软件架构的 4+1视图?如何运用?有什么优缺点?

一、41视图的起源 41视图最早由Philippe Kruchten提出。他在1995年的《IEEE Software》上发表了题为《The 41 View Model of Architecture》的论文&#xff0c;这一论文的发表引起了业界的极大关注&#xff0c;并最终被RUP&#xff08;Rational Unified Process&#xff0c;统一…

【力扣】有效的字母异位词

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定两个字符串 s …

详细分析SpringBootTest中的测试类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战3.1 项目测试3.2 功能测试 前言 书写测试类&#xff0c;一般只需要加入Test即可&#xff0c;但是结合Springboot项目来整体测试对应需要怎么下手 详细的Java知识点推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面…

负载组类型:电阻式、无功型、电阻式电抗型、电子型

发电机通常用于紧急情况。就其本质而言&#xff0c;紧急情况经常意外发生&#xff0c;这就是为什么运营和设施&#xff0c;尤其是石油和天然气行业或服务行业&#xff08;例如数据中心和医院&#xff09;的运营和设施&#xff0c;在现场配备发电机以备不时之需。永久或便携式备…

idea中使用springboot进行开发时遇到的工程结构问题汇总

idea中的工程结构和eclipse中不同&#xff0c;但是配置的内容都是一样的。 IDEA中也就是这个页面&#xff0c;快捷键ctrlaltshifts 如果在eclipse中&#xff0c;经常会遇到jre和jdk不正确的情况&#xff0c;但IDEA中这个问题很少&#xff0c;但是IDEA中会经常由于未正常配置根…

[C#]基于opencvsharp实现15关键点人体姿态估计

数据集 正确选择数据集以对结果产生适当影响也是非常必要的。在此姿势检测中&#xff0c;模型在两个不同的数据集即COCO关键点数据集和MPII人类姿势数据集上进行了预训练。 1. COCO&#xff1a;COCO关键点数据集是一个多人2D姿势估计数据集&#xff0c;其中包含从Flickr收集的…

海思SS928/SD3403开发笔记4——u盘挂载

首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图&#xff1a; 取消挂载 umount /mnt/usb

C#——命名空间详情

命名空间 在 C# 中&#xff0c;可以将命名空间看作是一个范围&#xff0c;用来标注命名空间中成员的归属&#xff0c;一个命名空间中类与另一个命名空间中同名的类互不冲突&#xff0c;但在同一个命名空间中类的名称必须是唯一的。 定义命名空间 定义命名空间需要使用 namesp…

JS在线加密简述

JS在线加密&#xff0c;是指&#xff1a;在线进行JS代码混淆加密。通过混淆、压缩、加密等手段&#xff0c;使得JS源代码难以阅读和理解。从而可以有效防止代码被盗用或抄袭&#xff0c;保护开发者的知识产权和劳动成果。常用的JS在线加密网站有&#xff1a;JShaman、JS-Obfusc…

怎么在vite项目中全局导入一个scss文件

怎么在vite项目中全局导入一个scss文件 &#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64…

【Redis】Java操作Redis(Jedis客户端使用)

Redis不仅支持简单的键值存储&#xff0c;还提供了丰富的数据结构&#xff08;如列表、哈希表、集合等&#xff09;和强大的原子操作&#xff0c;使得它在存储和处理数据时非常高效。关于这些数据结构的学习可以学习下面的博客&#xff1a; 【Redis】String的常用命令及图解St…

OBD诊断(ISO15031) 01服务

文章目录 功能简介PID 的功能请求和响应1、read-supported PIDs1.1、请求1.2、肯定响应 2、read PID value1.1、请求1.2、肯定响应 3、同时请求多个PID3、同时读取多个PID数据 Parameter definition报文示例1、单个PID请求和读取2、多个PID请求和读取 功能简介 01服务&#xf…

【Ubuntu24.04无显示器远控】【Todesk远程桌面黑屏】【Linux虚拟显示器】解决方案

1️⃣版本 Ubuntu 24.04Todesk 4.7.2.0xserver-xorg-video-dummy 1:0.4.0-1build1 2️⃣安装配置虚拟显示器 sudo apt install xserver-xorg-video-dummy编辑/etc/gdm3/custom.conf&#xff0c;关闭Ubuntu24.04Wayland切换为X11 WaylandEnablefalse /usr/share/X11/xorg.con…

NDT(基于正态分布变换的配准算法)

NDT是将单个扫描的离散点集转换为空间上定义的分段连续可微概率密度&#xff0c;该概率密度由一组易于计算的正态分布组成的算法。采用NDT连续化后&#xff0c;传统硬离散优化问题能够潜在地转化为更易于处理的连续优化问题。 NDT原理 NDT将根据点云中点所处的位置&#xff0…

网络治理新模式:Web3时代的社会价值重构

随着Web3技术的崛起&#xff0c;传统的网络治理模式正在经历革新&#xff0c;这不仅仅是技术的进步&#xff0c;更是对社会价值观念的挑战和重构。本文将深入探讨Web3时代的网络治理新模式&#xff0c;其背后的技术基础、社会影响以及未来的发展方向。 1. 引言 Web3时代&#…