jvm调优 总结 for面试

本文深入探讨Java中的垃圾回收机制,包括栈与堆的区别、不同类型的引用、四种主要的垃圾回收算法,以及各种垃圾回收器的特点与适用场景。此外,还介绍了如何设置堆大小以优化性能。
1.栈和堆
栈是运行时的单位,解决程序如何执行,代表处理逻辑
堆是存储单位,解决数据存储问题,代表数据
2.
分配内存按照8的整数倍
对象的引用:
强引用(声明对象时虚拟机生成的引用,不会被回收),
软引用(缓存,剩余内存不足时被回收)
弱引用(一定被回收)

4.垃圾回收算法
(1)引用计数:此对象有一个引用增加一个计数,删除一个引用减少一个计数。gc引用数是0的,循环引用问题无法处理
(2)标记-清楚MarkSweep:1.从引用根节点(栈)开始标记被引用的对象
形成一颗以java栈中引用所对应的对象为根节点的一颗对象树,栈中有多个引用会形成多个对象数
  2.遍历堆,清楚未标记的对象
要暂停整个应用,会产生内存碎片
(3)复制:内存被划分为2个相等的区域,每次用其中的1个
遍历当前正在用的区域,把里面使用中的复制到另一块,然后清理这一块
不会有碎片但是要2倍内存


(4)标记-整理MarkCompact:1.从根节点标记被引用对象
2.遍历堆,清楚未标记,把存活对象压缩到一起
避免了碎片,也不需要2倍空间


5.

增量收集:实时垃圾回收,应用进行的同时进行垃圾回收

  分代收集:基于对象的生命周期,对象分为年轻代,年老代tenured space,持久代,不同生命周期的对象使用不同的算法,提高回收效率
            生命周期比较长的:session对象,线程   生命周期短的:程序运行过程中的临时变量
不区分时每次回收都是回收整个堆内存,花费时间长,每次回收回收遍历所有,生命周期长的实际上这种遍历是无效果的
年轻代young:
伊甸园Eden*1 幸存区Survivor*2(2+)
scavenge gc:新对象生成在伊甸园申请空间失败时触发。  伊甸园区gc会比较频繁,需要速度快,效率高的算法

年老代tenured:
对象在年轻代经历N次GC后任然存活,会被放到年老代,一般存放生命周期比较长的对象
持久代perm:
存放静态文件,对垃圾回收无显著影响

full gc:清理整个堆   年老代/持久代被写满/system.gc()被调用

6.收集器
(1)串行收集器Serial Collector
单线程  适合单处理器机器  适合小数据量情况  效率高    
-xx:+useSerialGC
(2)并行收集器Paraller collector
    多线程处理垃圾回收工作,速度快,效率高
对年轻代进行并行垃圾回收,减少垃圾回收需要的时间
-xx:+useParallelGC
-xx:parallelGCThreads=<N>设置并行垃圾回收的线程数
-xx:macGCPauseMills=<N>垃圾回收最长暂停时间
-xx:gcTimeRatio=<N>  1/n+1  吞吐量  垃圾回收时间和费垃圾回收时间的比值
也可以对年老代进行并行收集
(1)(2)要暂停整个运行环境,只有垃圾回收程序运行,系统在垃圾回收时会有明显的暂停,堆越大停的时间越长
垃圾回收过程中应用响应时间可能加长
适合多Cpu对应用响应无要求的大中型应用
(3)并发收集器
应用不停止,垃圾回收只暂停很少的时间。   适合响应时间要求高的中大规模应用
CMS(并发标记清理收集器,Concurrent Mark Sweep)
主要用在老年代,在应用不停止的情况下使用独立的垃圾回收线程,短暂的停顿
-xx:+useConMarkSweepGc
浮动垃圾:应用运行同时回收垃圾,垃圾回收进行完成时会产生垃圾,在下个垃圾回收周期才可以回收。
并发模式失败concurrent mode failure:并发模式在应用运行时进行垃圾的回收,要保证堆在垃圾回收这段时间有足够的时间供程序使用
垃圾回收还没完成,堆就满了,会发生并发模式失败,整个应用会暂停。

        -xx:cmsInitiatingOccupancyFraction=<N>指定还有多少剩余堆时开始执行并发收集

7.堆大小设置
   限制因素:操作系统32/64   系统可用虚拟内存    系统可用物理内存
   java -xmx3550m  jvm最大可用内存3550m
           -xms3550m  jvm初始内存,避免每次gc后jvm重新分配内存
   -xmn2g      年轻代大小  2g   持久代固定64m  增大年轻代会减少年老代 sun推荐为整堆得3/8
   -xss128k   每个线程的堆栈大小  jdk5以后是1m
   -xx:newRation=4  年轻代和老年代比例为1:4
   -xx:survivorRation=4 两个幸存区和伊甸园的比例2:4
   -xx:maxRermSize=16 持久代大小为16M
   -xx:maxTenuringThreshold=0 从年轻代进入老年代的门槛,设置为0,年轻代的对象不经过幸存区直接进到老年区
设置为一个较大的值就是要在幸存区进行多次复制,增加对象在年轻代的存活时间增加年轻代被回收的概率


8.jdk5以后会根据当前系统配置判断使用哪种收集器,以前是串行想用其他的要加入配置

并行:



并发:



<think>首先,用户要求提供与JVM相关的面试题列表。用户说:“我想请求提供与JVM相关的面试题列表 请问列举一些常见的JVM相关的面试问题”。所以,我需要生成一个列表常见的JVM面试问题。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 - 用户可见层:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 另外,参考站内引用: - 引用[1]: 关于吞吐量和响应时间。 - 引用[2]: 关于堆外内存和OOM。 - 引用[3]: 关于JVM参数设置。 这些引用是供参考的,我应该尽可能参考用户上一次的问题和我的回答。但在这个上下文中,用户是直接请求面试题列表,所以我会基于这些引用来生成相关问题。 我的回答结构: 1. **清晰的结构**:我需要组织回答,使其易于理解。可能以列表形式提供面试问题。 2. **生成相关问题**:指令要求生成相关问题。在示例中,相关问题是在回答后添加的,如“§§相关问题§§”。所以,我应该在回答完用户请求后,添加一些相关问题。 3. **引用**:在回答中,如果引用段落,末尾添加引用标识。例如,提到吞吐量时,可以添加[^1]。 用户请求是列举常见的JVM面试问题。基于我的知识,常见的面试问题包括: - JVM内存模型(堆、栈、方法区等)。 - 垃圾回收机制(GC算法、参数)。 - 性能(吞吐量、响应时间)。 - 常见问题(OOM错误、内存泄漏)。 - 工具(jstat, jmap, jconsole等)。 从参考引用中: - 引用[1]提到吞吐量和响应时间,这可以是一个问题。 - 引用[2]提到堆外内存和OOM。 - 引用[3]提到JVM参数设置。 所以,我可以基于这些来创建列表。 列出常见的JVM面试问题: 1. 什么是JVM?其目标是什么? 2. 解释吞吐量和响应时间在JVM中的重要性。 3. 如何监控JVM性能?常用工具有哪些? 4. 描述常见的垃圾回收算法及其缺点。 5. 如何GC以减少停顿时间? 6. 什么是堆外内存?如何避免堆外内存导致的OOM? 7. 解释JVM参数如-Xmx, -Xms, -XX:NewRatio等的含义和。 8. 如何处理内存泄漏问题? 9. JVM中如何平衡吞吐量和响应时间? 10. 实际案例:如何诊断和解决频繁Full GC问题? 在回答中,我可以简要解释每个问题,但用户只是请求列表,所以可能只需列出问题。不过,为了帮助用户,我可以提供简要描述。 生成相关问题:在回答后,添加“§§相关问题§§”部分,列出一些相关问题,如示例中所示。例如: - 如何具体JVM参数? - JVM的最佳实践是什么? - 等等。 确保使用中文回答。 最终输出结构: - 开头直接回答用户请求:列举常见的JVM面试问题。 - 提供列表。 - 在适当的地方添加引用标识。 - 最后,添加“§§相关问题§§”部分。</think>### JVM相关面试题列表 以下是常见的JVM面试问题列表。这些问题基于JVM的核心概念、性能指标、策略和实际应用,覆盖了内存管理、垃圾回收(GC)、性能监控等关键领域。我会为每个问题提供简要解释,以帮助您理解其背景和重要性。在解释中,我会自然地引用参考内容(如吞吐量、堆外内存等),并在相关段落末尾添加引用标识[^1][^2][^3]。这些问题旨在帮助您准备面试,确保回答真实可靠,基于JVM的最佳实践。 1. **什么是JVM?其主要目标是什么?** JVM是通过JVM参数和化代码来提升Java应用性能的过程。目标包括提高吞吐量(用户代码执行时间占比)、减少响应时间(用户代码执行时间 + GC执行时间),以及避免内存溢出等问题[^1]。关键是要根据业务需求决定是先吞吐量还是响应时间。 2. **解释吞吐量和响应时间在JVM中的重要性,并说明如何权衡两者?** 吞吐量定义为用户代码执行时间除以总执行时间(用户代码执行时间 + GC执行时间),响应时间是整个操作的完成时间。高吞吐量适合后台批处理任务,而低响应时间对实时系统至关重要。时需通过GC算法选择(如Parallel GC for吞吐量,G1 GC for响应时间)来平衡两者[^1]。 3. **常见的垃圾回收算法有哪些?各自缺点是什么?** 包括Serial GC(简单但停顿长)、Parallel GC(高吞吐量)、CMS GC(低停顿但碎片多)和G1 GC(平衡吞吐和响应)。例如,G1 GC适合大堆应用,能减少停顿时间(STW),从而化响应时间[^1]。 4. **如何监控JVM性能?常用工具有哪些?** 使用jstat(监控GC统计)、jmap(堆内存快照)、jconsole(图形化监控)和VisualVM。这些工具帮助诊断内存泄漏或GC问题,例如通过jmap分析堆转储来定位OOM原因[^2]。 5. **什么是堆外内存(Off-Heap Memory)?如何避免其导致的OOM错误?** 堆外内存是JVM堆之外的本地内存区域,用于NIO等操作。如果分配不足,不会主动触发GC,可能导致OOM。避免方法包括限制Direct Memory使用(-XX:MaxDirectMemorySize参数)或确保堆GC时回收相关资源[^2]。 6. **解释关键JVM参数(如-Xmx, -Xms, -XX:NewRatio)的含义和方法?** -Xmx设置最大堆大小,-Xms设置初始堆大小,-XX:NewRatio整新生代和老年代比例。时需根据应用负载整,例如增加-Xmx避免OOM,或化-XX:NewRatio减少Full GC频率。参数值可通过jinfo查看和修改[^3]。 7. **如何处理内存泄漏问题?诊断步骤是什么?** 内存泄漏指对象无法被GC回收,导致堆增长。诊断步骤:使用jmap获取堆转储,分析工具(如MAT)查找泄漏对象;监控GC日志确认老年代增长;修复代码中未释放的资源(如静态集合)。 8. **如何减少GC停顿时间(STW)?化策略有哪些?** STW(Stop-The-World)是GC时的应用暂停。化策略包括选择低停顿GC(如ZGC或Shenandoah)、年轻代大小(-XX:NewSize),或启用并发标记(-XX:+UseConcMarkSweepGC)。目标是缩短响应时间[^1]。 9. **JVM中如何诊断和解决频繁Full GC问题?** 频繁Full GC通常由内存不足或不当参数引起。诊断:使用jstat监控GC频率;检查堆大小是否不足(高-Xmx);或化对象分配(减少大对象)。解决后需验证吞吐量和响应时间改善[^1]。 10. **实际应用中,JVM的最佳实践是什么?** 包括:根据应用类型(Web服务或批处理)设定目标(如响应时间先);定期监控性能基线;使用-XX:+PrintGCDetails记录GC日志;并避免过度先代码化)。例如,电商系统可能侧重低响应时间[^3]。 这些问题覆盖了JVM的核心知识点,面试中常结合具体场景提问。准备时建议结合实际案例练习,例如使用模拟工具重现OOM或GC问题。如果您需要更详细的解释或示例,请随时告知!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值