Java面试题、八股文学习之JVM篇

embedded/2024/11/27 9:58:27/

1.你知道哪些垃圾收集算法

垃圾收集(Garbage Collection,简称GC)是自动内存管理的一部分,它负责回收不再使用的对象所占用的内存空间。不同的编程语言和运行环境可能使用不同的垃圾收集算法。以下是几种常见的垃圾收集算法:

标记-清除(Mark and Sweep)

这是最基本的垃圾收集算法之一。它分为两个阶段:首先“标记”所有需要保留的对象,然后在“清除”阶段释放未被标记的对象占用的空间。

复制(Copying)

复制算法将可用内存按容量划分为大小相等的两块,每次只用其中一块。当这一块内存用完时,就将尚存活的对象复制到另一块上面,然后把已使用过的内存空间一次清理掉。这种方法适用于对象存活率较低的情况。

标记-整理(Mark-Compact)

标记-整理算法在完成标记过程后,将所有存活的对象向内存空间的一端移动,然后清理掉端边界以外的内存。这种方式可以减少内存碎片。

分代收集(Generational Collection)

分代收集是基于观察到大多数对象都是短命的这一事实而设计的。它将对象根据生命周期的不同划分成几个“代”。年轻代(Young Generation)通常包含新创建的对象,老年代(Old Generation)则包含存活时间较长的对象。不同代可以采用不同的垃圾收集策略。

增量收集(Incremental Collection)

增量收集是指垃圾收集器不是一次性完成整个收集工作,而是将其分成多个小步骤来执行,以减少单次垃圾收集对应用程序性能的影响。

并行与并发收集(Parallel and Concurrent Collection)

并行收集指的是使用多个线程同时进行垃圾收集的工作,从而提高效率。并发收集则允许垃圾收集器与应用程序线程同时运行,以减少停顿时间。

区域收集(Region-based Collection)

区域收集是一种将内存划分为多个区域的技术,每个区域可以独立进行垃圾收集。这种方法有助于更好地控制内存使用模式,并可以更灵活地调整垃圾收集策略。

2.调用命令有哪些

调优命令主要取决于您想要优化的具体方面,比如系统性能、网络配置、数据库性能等。下面列举了一些常见的调优命令及其用途,这些命令可以在Linux系统中找到,对于其他操作系统,类似的工具也存在。

系统性能调优

  • top 和 htop

    • 用于实时查看系统资源使用情况,包括CPU、内存、进程等信息。
    • htop 提供了比 top 更加友好的界面和更多的功能。
  • vmstat

    • 显示虚拟内存统计信息,帮助了解系统的内存使用状况。
  • iostat

    • 用于监控系统输入/输出设备负载,如磁盘读写速度。
  • netstat

    • 显示网络状态信息,包括连接、路由表、接口统计等。
  • sysctl

    • 用于查看或设置内核参数,常用于性能调优。
  • ulimit

    • 设置用户进程的资源限制,如打开文件描述符的数量等。

数据库性能调优

  • MySQL/MariaDB
    • SHOW GLOBAL STATUS; 查看服务器状态变量。
    • SHOW VARIABLES; 查看服务器系统变量。
    • EXPLAIN 分析SQL查询执行计划。
  • PostgreSQL
    • pg_stat_activity 监控活动会话。
    • pg_stat_statements 跟踪查询执行统计。

网络性能调优

  • iperf3
    • 测试网络带宽和性能。
  • ping
    • 检测网络连接状态和延迟。
  • traceroute
    • 显示数据包到达目标主机所经过的路由。
  • ss 和 netstat
    • 查看网络连接状态。

文件系统调优

  • tune2fs
    • 用于调整ext2/ext3/ext4文件系统的参数。
  • xfs_info 和 xfs_db
    • 查看和调整XFS文件系统的参数。

内存调优

  • free 和 vmstat
    • 查看内存使用情况。
  • /proc/meminfo
    • 详细查看内存使用信息。

安全性和访问控制调优

  • iptables 或 nftables
    • 配置防火墙规则。
  • selinux 或 apparmor
    • 设置强制访问控制策略。

3.常见调优工具有哪些

1. 代码性能分析工具
这些工具帮助开发者发现代码中的性能瓶颈、内存泄漏以及不必要的资源消耗。

  • Chrome DevTools(浏览器调试工具)

    • 用于前端开发,分析网页性能、JS 执行时间、内存使用等。
    • 包括:Performance、Memory、Network、Rendering、Lighthouse 等面板。
  • Web Vitals(前端性能监控)

    • 用于监控 Web 性能指标,如加载速度、交互响应时间、视觉稳定性等。
    • 集成到 Google Analytics 或直接通过 JavaScript 获取。
  • Lighthouse(前端性能优化)

    • 一个开源工具,可以用于评估网站的性能、可访问性、SEO 和最佳实践。
    • 可以通过 Chrome DevTools、命令行工具或 CI/CD 集成使用。
  • ESLint(前端代码质量工具)

    • 用于静态分析 JavaScript 和 TypeScript 代码,检测潜在的错误和不良编码习惯。
    • 可以集成到开发环境中实时提示问题,支持自定义规则。
  • JProfiler(Java 性能分析)

    • 用于 Java 应用的性能调优,支持 CPU 和内存分析、线程分析等功能。
    • 提供实时的内存使用、垃圾回收和执行路径的可视化分析。
  • YourKit(Java 和 .NET 性能分析)

    • 一个跨平台的性能分析工具,支持 Java 和 .NET 应用。
    • 提供内存泄漏检测、CPU 性能分析、线程分析等。

2. 系统监控和性能调优工具

这些工具用于监控操作系统、数据库等底层系统的性能,并提供调优建议。

  • Prometheus + Grafana(系统监控和可视化)

    • Prometheus:用于收集系统、应用的时序数据,并进行存储和查询。
    • Grafana:将 Prometheus 收集的数据可视化,提供丰富的仪表盘和监控警报功能。
    • 适用于大规模分布式系统的监控和性能优化。
  • New Relic(应用性能监控)

    • 提供全面的应用监控和性能分析,支持 Java、Node.js、Ruby 等多种开发语言。
    • 可追踪请求响应时间、数据库查询性能、外部 API 调用等。
  • Datadog(云基础设施监控)

    • 提供云环境、应用程序和服务器的全面监控和性能分析。
    • 支持集成云服务(AWS、Azure、GCP)及各类容器化平台(Docker、Kubernetes)。
  • Nagios(系统和网络监控)

    • 主要用于监控 IT 基础设施,检查服务器、网络设备、数据库等的健康状态。
    • 提供多种插件和集成工具,广泛应用于大中型企业。
  • htop(Linux 系统性能监控)

    • 提供类似于 top 命令的进阶版本,支持多种过滤和排序选项。
    • 可以实时监控系统的 CPU、内存、进程等资源的使用情况。
  • sysstat (sar)(Linux 性能监控)

    • 用于收集和报告 Linux 系统性能数据,包括 CPU 使用率、内存、磁盘 I/O、网络流量等。
    • 可用于长期性能监控和趋势分析。
  • iostat(Linux I/O 性能监控)

    • 用于监控磁盘 I/O 性能,能够提供磁盘读写的详细统计数据。

3. 数据库性能调优工具

针对数据库进行性能分析和优化,帮助识别查询瓶颈、锁争用等问题。

  • MySQL Workbench(MySQL 性能分析)

    • 提供可视化的数据库设计、查询性能分析、慢查询日志分析等功能。
    • 包含数据库调优工具,帮助优化查询和表结构。
  • pgAdmin(PostgreSQL 性能分析)

    • PostgreSQL 的管理工具,提供对数据库的可视化管理和性能调优功能。
    • 包含查询分析器、执行计划查看器等功能,帮助优化 SQL 查询。
  • Percona Toolkit(MySQL 和 MongoDB 性能工具)

    • 包含多种命令行工具,用于诊断 MySQL 和 MongoDB 性能问题。
    • 可以进行查询分析、慢查询日志分析、数据库压缩等任务。
  • SQL Server Management Studio (SSMS)(SQL Server 性能优化)

    • 提供 SQL Server 的性能监控和调优功能。
    • 包含查询执行计划、索引优化和数据库健康检查工具。

4. 网络性能调优工具
用于分析网络延迟、吞吐量、丢包率等问题,优化网络性能。

  • Wireshark(网络数据包分析)

    • 一个强大的网络抓包和分析工具,可以分析网络流量、延迟、协议错误等。
    • 常用于排查网络问题、性能瓶颈及安全漏洞。
  • iperf(网络带宽性能测试)

    • 用于测试网络带宽性能,支持 TCP/UDP 性能测试。
    • 常用于测试不同主机或网络设备之间的带宽情况。
  • PingPlotter(网络延迟分析)

    • 一个网络诊断工具,用于追踪网络路径和测量延迟,帮助找到网络瓶颈或丢包问题。

5. 前端性能调优工具

针对 Web 应用的前端性能进行优化和调优。

  • Webpack Bundle Analyzer(Webpack 性能分析)

    • 可视化 Webpack 打包后的文件结构,帮助分析哪些模块占用了过多的资源。
    • 用于优化前端打包文件的大小,减少加载时间。
  • Source Map Explorer(JavaScript 包分析)

    • 通过分析源映射文件,帮助开发者了解压缩和打包后的 JavaScript 文件中各模块的大小。
    • 用于分析和减少前端包的体积。

调优工具的选择取决于你的应用类型(前端、后端、数据库、系统等)和需要优化的方面(性能、内存、带宽、查询等)。使用这些工具可以帮助开发人员在不同的层面识别瓶颈并进行优化,提高应用的稳定性和性能。

4. Minor GC与Full GC分别在什么时候发生?

在Java的垃圾回收(Garbage Collection,GC)过程中,Minor GC和Full GC是两种不同类型的垃圾回收事件,它们各自有不同的触发条件和作用范围。

Minor GC(年轻代垃圾回收)

发生条件:

  • 当新生代(Young Generation)中的Eden区没有足够的空间分配新的对象时,会触发Minor GC。
  • 在Minor GC过程中,垃圾回收器会清理Eden区和两个Survivor区之一的对象,将存活的对象复制到另一个Survivor区,如果Survivor区的空间也不足,部分对象可能会被提升到老年代(Old Generation)。

特点:

  • Minor GC的频率通常比Full GC高,因为大多数对象都是短生命周期的,很快就会变成垃圾。
  • Minor GC的速度相对较快,因为它只处理较小的内存空间。

Full GC(全垃圾回收)

发生条件:

  • 当老年代(Old Generation)空间不足时,可能会触发Full GC。这种情况通常发生在大量对象从新生代晋升到老年代,或者大对象直接在老年代创建时。
  • 当永久代(PermGen,Java 8及以后版本称为Metaspace)空间不足时,也可能触发Full GC。
  • 显式调用System.gc()方法时,JVM会尝试执行一次Full GC(虽然不推荐这样做)。
  • 在某些垃圾回收器配置下,如果长时间未能成功执行Minor GC,也可能触发Full GC。

特点:

  • Full GC会回收整个堆空间,包括新生代和老年代。
  • Full GC通常比Minor GC耗时更长,因为它需要检查和清理更大范围的内存空间。
  • Full GC可能导致应用程序暂停(Stop-The-World),影响用户体验和系统性能。

总结

  • Minor GC 主要针对新生代进行垃圾回收,当Eden区满时触发,速度快,频率高。
  • Full GC 则是对整个堆空间进行垃圾回收,包括新生代和老年代,当老年代空间不足时触发,速度慢,频率低,但清理彻底。
  • 为了优化垃圾回收性能,可以通过调整JVM参数来控制堆内存大小、新生代和老年代的比例、选择合适的垃圾回收器等手段,以减少垃圾回收的频率和时间。

5.你知道哪些JVM性能调优参数?(简单版回答)

  • 堆内存大小

    • -Xms:设置初始堆内存大小。
    • -Xmx:设置最大堆内存大小。
  • 新生代大小

    • -Xmn:设置新生代的大小。
    • -XX:NewRatio=:设置新生代与老年代的比例。
  • Survivor区大小

    • -XX:SurvivorRatio=:设置Eden区与Survivor区的比例。
  • 垃圾回收器选择

    • -XX:+UseSerialGC:使用串行垃圾回收器。
    • -XX:+UseParallelGC:使用并行垃圾回收器。
    • -XX:+UseConcMarkSweepGC:使用CMS垃圾回收器(Java 9及以后版本已废弃)。
    • -XX:+UseG1GC:使用G1垃圾回收器。
    • -XX:+UseZGC:使用Z垃圾回收器(Java 11及以上版本)。
    • -XX:+UseShenandoahGC:使用Shenandoah垃圾回收器(Java 12及以上版本)。
  • 垃圾回收日志

    • -Xlog:gc*:file=gc.log:time,uptime,pid,tid,level,tags:启用详细的垃圾回收日志记录。
  • 其他调优参数

    • -XX:MaxGCPauseMillis=
    • -XX:GCTimeRatio=:设置垃圾回收时间占总时间的比例。
    • -XX:+UseStringDeduplication:启用字符串去重。

http://www.ppmy.cn/embedded/140868.html

相关文章

在 Mac(ARM 架构)上安装 JDK 8 环境

文章目录 步骤 1:检查系统版本步骤 2:下载支持 ARM 的 JDK 8步骤 3:安装 JDK步骤 4:配置环境变量步骤 5:验证安装步骤 6:注意事项步骤7:查看Java的安装路径 在 Mac(ARM 架构&#xf…

docker入门学习笔记

docker的定义 docker是一个用于构建、运行、传送 应用程序的平台。 为什么要使用docker ? 在开发测试库环境中测试成功后,打包成集装箱,到生产环境也是能够成功的。而传统的安装方式不仅繁琐,并且在测试环境安装后,到…

关于IDE的相关知识之三【插件安装、配置及推荐的意义】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件安装、配置及推荐意义的相关内容…

【Redis篇】String类型命令详讲以及它的使用场景

目录 前言: 基本命令: setnx/setxx FLUSHALL mest mget 计数命令 INCR / INCRBY DECR/DECYBY INCRBYFLOAT 其他命令 APPEND GETRANGE SETRANGE STRLEN String的典型使用场景 缓存(Cache)功能 计数(…

Python 网络爬虫操作指南

网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南,帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…

display相关的一些知识

1. DSI (MIPI DSI) 的 Video Mode 和 Command Mode MIPI DSI 是一种针对移动设备设计的显示接口,确实具有 Video Mode 和 Command Mode 的概念,这是它的一个显著特点: Video Mode 工作方式:数据流以固定的时间间隔传输帧缓冲内容…

【优先算法学习】双指针--结合题目讲解学习

目录 1.有效三角形的个数 1.2题目解题思路 1.3代码实现 2.和为s的两个数 2.1刷题链接-> 2.2题目解题思路 2.3代码实现 1.有效三角形的个数 1.1刷题链接-> 力扣-有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/description/ 1.2题目解…

css—轮播图实现

一、背景 最近和朋友在一起讨论的时候,我们提出了这样的一个提问,难道轮播图的效果只能通过js来实现吗?经过我们的一系列的争论,发现了这是可以通过纯css来实现这一效果的,CSS轮播图也是一种常见的网页展示方式&#x…