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

相关推荐
momo_aa2 小时前
mac找到主目录下的文件夹
经验分享
独行soc2 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
sszmvb12343 小时前
测试开发 | 电商业务性能测试: Jmeter 参数化功能实现注册登录的数据驱动
jmeter·面试·职场和发展
测试杂货铺3 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
王佑辉3 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
真忒修斯之船3 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
ZL不懂前端4 小时前
Content Security Policy (CSP)
前端·javascript·面试
AAA 建材批发王哥(天道酬勤)4 小时前
JVM 由多个模块组成,每个模块负责特定的功能
jvm
测试界萧萧4 小时前
外包干了4年,技术退步太明显了。。。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展