java虚拟机疑问与解答 清疚 2022-07-12 05:08 154阅读 0赞 # 内存相关 # 1、哪些内存区域是共享的,哪些又是线程私有的? 共享的:方法区、堆 私有的:栈、本地栈、程序计数器 2、哪个内存区域不会有OOM? 程序计数器 3、哪个区域会有StackOverFlowError? 域区与本地栈 # GC相关 # 1、如何打开GC日志? 参考:[http://ifeve.com/useful-jvm-flags-part-8-gc-logging/][http_ifeve.com_useful-jvm-flags-part-8-gc-logging] 这个地方还有系列介绍参数的博文值得一看 \-XX:+PrintGC 简单日志 \-XX:PrintGCDetails 详细参数 \-XX:+PrintGCTimeStamps和-XX:+PrintGCDateStamps 日期、时间戳 \-Xloggc 指定GC日志输出文件 2、如何看懂GC日志? GC日志与收集器关系很大,不同的收集器日志格式不一样,但是基本的共性数值还有是有: 回收类型(Minor Or Full GC,后者会Stop The World)、什么时间点发生、 特定区域(如年轻代)回收前后内存大小对比、堆内存回收前后内存大小的对比、运行时长等; 观察这些参数就可以判断GC的相关操作情况。 3、不同收集器的表格整理 <table> <tbody> <tr> <td style="color:white; background:black">收集器</td> <td style="color:white; background:black">多线程</td> <td style="color:white; background:black">回收区域</td> <td style="color:white; background:black">回收算法</td> <td style="color:white; background:black">特点</td> <td style="color:white; background:black">缺点</td> <td style="color:white; background:black">可以配合回收器</td> </tr> <tr> <td style="background:rgb(217,217,217)">Serial</td> <td style="background:rgb(217,217,217)">否</td> <td style="background:rgb(217,217,217)">新生代</td> <td style="background:rgb(217,217,217)">复制</td> <td style="background:rgb(217,217,217)">运行在Client模式下,简单高效</td> <td style="background:rgb(217,217,217)">单线程,不适合运行在高性能的服务器上</td> <td style="background:rgb(217,217,217)">Serial Old <br> CMS</td> </tr> <tr> <td>ParNew</td> <td>是</td> <td>新生代</td> <td>复制</td> <td>Serial多线程实现</td> <td>暂无</td> <td>Serial Old <br> CMS</td> </tr> <tr> <td style="background:rgb(217,217,217)">Parallel Scavenge</td> <td style="background:rgb(217,217,217)">是</td> <td style="background:rgb(217,217,217)">新生代</td> <td style="background:rgb(217,217,217)">复制</td> <td style="background:rgb(217,217,217)">吞吐量优先、有参数可以控制吞吐量,最大停顿时间,还可以设置自适应调节vm参数</td> <td style="background:rgb(217,217,217)">暂无</td> <td style="background:rgb(217,217,217)">Serial Old <br> Parallel Old</td> </tr> <tr> <td>CMS</td> <td>是</td> <td>老年代</td> <td>标记-清除</td> <td>设计目标是低停顿、可以与用户线程(几乎)并发执行</td> <td>1、CPU资源敏感<br> 2、无法处理浮动垃圾(收集过程中产生的新垃圾)<br> 3、标记-清除算法会有碎片产生(顶不住要进行FullGC时会触发碎片整理)</td> <td>Serial<br> ParNew<br> Serial Old(CMF)</td> </tr> <tr> <td style="background:rgb(217,217,217)">Serial Old</td> <td style="background:rgb(217,217,217)">否</td> <td style="background:rgb(217,217,217)">老年代</td> <td style="background:rgb(217,217,217)">标记-整理</td> <td style="background:rgb(217,217,217)">Serial老年代实现、也比较适合在client模式下使用</td> <td style="background:rgb(217,217,217)">单线程,不适合运行在高性能的服务器上</td> <td style="background:rgb(217,217,217)">Serial<br> ParNew<br> Parallel Scavenge</td> </tr> <tr> <td>Parallel Old</td> <td>是</td> <td>老年代</td> <td>标记-整理</td> <td>Parallel的老年代实现,也是吞吐量优先的算法</td> <td>暂无</td> <td>Parallel Scavenge</td> </tr> <tr> <td style="background:rgb(217,217,217)">G1</td> <td style="background:rgb(217,217,217)">是</td> <td style="background:rgb(217,217,217)">所有</td> <td style="background:rgb(217,217,217)">标记-整理,局部也类似有复制算法</td> <td style="background:rgb(217,217,217)">1、设计目标是低停顿,与CMS相同<br> 2、并发与并行都可以<br> 3、分代收集概念得以保留,虽然不需要其它收集器配合<br> 4、标记-整理算法,没有垃圾<br> 降低停顿,几乎可以预测的停顿时间模型,CMS无法预测</td> <td style="background:rgb(217,217,217)">暂无</td> <td style="background:rgb(217,217,217)">不需要配合</td> </tr> </tbody> </table> 3.1、不同的收集器组合的适用场景是什么?各有什么优缺点。 <table> <tbody> <tr> <td style="color:white; background:black">组合</td> <td style="color:white; background:black">适用场景</td> </tr> <tr> <td style="background:rgb(217,217,217)">Serial<br> Serial Old</td> <td style="background:rgb(217,217,217)">单线程回收,适合在client模式下小内存,简单快速回收</td> </tr> <tr> <td>ParNew<br> CMS</td> <td>适合在高性能服务器上实现低停顿的垃圾回收,如B/S服务器等</td> </tr> <tr> <td style="background:rgb(217,217,217)">Parallel Scavenge<br> Parallel Old</td> <td style="background:rgb(217,217,217)">适合在高性能服务器上实现CPU敏感以及吞吐量优先的垃圾回收,比如大量计算的程序</td> </tr> </tbody> </table> 4、诊断JVM故障时一般的步骤是什么? 查看日志:应用程序日志、GC日志; 查看堆内存转储文件,分析异常内存占用:jmap转储; 查看异常调用堆栈信息:jstack VisualVm实时查看vm信息; 分析堆内存转储文件:Eclipse Heap Analysis Tools; 4.1、优化手段 应用程序优化; 服务器硬件升级; 调整VM参数; 32位替换64位vm,并开多个虚拟机等; 5、垃圾收集器按回收区域分类是怎么样的? 年轻代收集器:Serial/ParNew/Parallel Scavenge 老年代收集器:CMS/Serial Old/Parallel Old 整个堆收集器:G1 ![收集器关系图][SouthEast] 参考博客:[http://blog.csdn.net/u010723709/article/details/47355499][http_blog.csdn.net_u010723709_article_details_47355499] 搜索jvm垃圾收集器关系图即可 [http_ifeve.com_useful-jvm-flags-part-8-gc-logging]: http://ifeve.com/useful-jvm-flags-part-8-gc-logging/ [SouthEast]: /images/20220711/005c7185756f4c4d98230c6b0d4c95dd.png [http_blog.csdn.net_u010723709_article_details_47355499]: http://blog.csdn.net/u010723709/article/details/47355499
相关 理解与实践:Java类加载机制的疑问解答 在Java编程中,类加载机制是一个关键概念。以下是对几个主要问题的解答: 1. **什么是类加载**: 类加载是Java虚拟机(JVM)初始化一个类的过程。 2. * 绝地灬酷狼/ 2024年09月16日 17:51/ 0 赞/ 11 阅读
相关 Java常量池疑问与解答实例 在Java中,常量池是内存的一部分,用于存储编译器生成的字面量、符号引用等信息。 以下是一些关于常量池的常见疑问及其解答: 1. 问:什么是字面量? 答:字面量是指直接出现 ゝ一纸荒年。/ 2024年09月13日 12:57/ 0 赞/ 13 阅读
相关 Java面向对象编程基础疑问解答 当然,我很乐意帮你解答关于Java面向对象编程的基础问题。请告诉我具体的问题吧。例如,你可以问我"什么是封装?如何在Java中实现封装?"这样的问题。 青旅半醒/ 2024年09月12日 04:18/ 0 赞/ 26 阅读
相关 Java垃圾回收机制:常见疑问解答 在Java编程中,垃圾回收(Garbage Collection,GC)是一个自动的过程,旨在管理程序中的不再使用的内存。以下是关于Java垃圾回收的一些常见疑问的解答: 1 亦凉/ 2024年09月11日 20:00/ 0 赞/ 26 阅读
相关 新手困惑解答:Java语言基础的疑问及解答 在学习Java语言基础时,可能会遇到一些疑问。以下是一些常见问题及其解答: 1. **Java是什么?** Java是一种广泛使用的、面向对象的编程语言。由Sun M 深藏阁楼爱情的钟/ 2024年09月11日 02:54/ 0 赞/ 14 阅读
相关 Java内存模型(Memory Model)理解与常见疑问解答 Java内存模型(Java Memory Model,简称JMM)是Java语言规范的一部分,它定义了所有Java虚拟机必须遵守的行为规则。 理解和处理Java内存模型的常见 古城微笑少年丶/ 2024年09月05日 14:30/ 0 赞/ 15 阅读
相关 java虚拟机疑问与解答 内存相关 1、哪些内存区域是共享的,哪些又是线程私有的? 共享的:方法区、堆 私有的:栈、本地栈、程序计数器 2、哪个内存区域不会有OOM? 程序计数 清疚/ 2022年07月12日 05:08/ 0 赞/ 155 阅读
还没有评论,来说两句吧...