《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)

简介: 《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)

Oracle HotSpot JVM Memory

Java HotSpot VM Heap space

Oracle Java 热点虚拟机中不同 Java 堆内存空间的高级概览。鉴于内存问题的频繁出现,对于任何参与生产支持的人来说,理解这一点非常重要。正确理解 Java VM 堆空间至关重要。您的 Java VM 基本上是 Java 程序的基础,为您提供动态内存管理服务、垃圾收集、线程、I/O 和本机操作等功能。Java 堆空间是运行时 Java 程序的内存“容器”,为您的 Java 程序提供所需的适当内存空间(包括 Java 堆和本地堆),并由 JVM 自身管理。

JVM HotSpot虚拟机的内存分为3个内存空间:

  • The Java Heap —— Java堆
  • The Metaspace 元空间(metaspace) / The PermGen (permanent generation) space —— PermGen(永久生成空间)
  • The Native Heap (C-Heap) —— 本地堆(C-Heap)

内存空间分布

内存空间 启动参数 监控策略 描述
Java堆 -Xmx(最大堆空间)-Xms(最小堆尺寸)EX:-Xmx1024m -Xms1024m verbose GC、JMX API、JConsole Java堆正在存储您的主Java程序类实例。
本地堆(C-Heap) 不能直接配置。对于32位虚拟机,CHeap容量=4Gig-Java堆为64位虚拟机,CHeap容量=物理服务器总内存和虚拟内存-Java堆 svmon命令是在AIX操作系统上用于监视内存使用情况的命令。通过svmon命令,可以查看系统中进程的内存使用情况、虚拟内存使用情况、分页空间情况等。 C-Heap正在存储类元数据对象,包括库文件、其他JVM和第三方本机代码对象。
  • verbose GC选项可以在控制台上输出详细的垃圾回收信息,包括垃圾回收的时间、频率以及内存清理情况,有助于开发人员分析程序的内存使用情况以及垃圾回收的效率,从而优化程序的性能。
  • JMX API(Java Management Extensions)是Java平台的一项管理和监控技术,它提供了一套标准的API,用于监控和管理应用程序、设备和服务。通过JMX API,开发人员可以在运行时获取JVM的状态信息,进行性能检测、故障诊断等操作。
  • JConsole是Java自带的一款监控工具,通过JMX技术实现对Java应用程序的监控。开发人员可以使用JConsole来查看应用程序的内存使用情况、线程情况、类加载情况等,还可以通过JConsole执行一些轻量级的分析和管理操作。同时,JConsole也可以通过JMX连接到远程JVM,对远程应用程序进行监控和管理。

注意 C-Heap正在存储类元数据对象,包括库文件、其他JVM和第三方本机代码对象,Oracle也将开始删除热点VM的PermGen空间。

内存分布图

Oracle JRockit JVM Memory

JRockit VM内存被分成两个内存空间:

  • Java堆(YoungGen和OldGen)
  • 本机内存空间(类池、C-Heap、线程)

内存空间分布

内存空间 启动参数 监控策略 描述
Java堆 -Xmx(最大堆空间)-Xms(最小堆尺寸)EX:-Xmx1024m -Xms1024m verbose GC、JMX API、JConsole JRockit Java堆通常被分为年轻Gen(短寿命对象)和OldGen(长寿命对象)。
本机内存空间 不能直接配置。对于32位虚拟机,本地内存空间容量=2-4gig-Java堆进程大小限制为2 GB,3 GB或4 GB,这取决于您的操作系统对于64位虚拟机,本地内存空间容量=物理服务器总内存和虚拟内存-Java堆 总进程大小检查在窗口和Linux,pmap命令在Solaris和Linux - JRockit JRCMD工具 JRockit本机内存空间正在存储Java类元数据、线程和对象,如库文件、其他JVM和第三方本机代码对象。

与IBM VM类似,JRockit VM没有PermGen空间 / metaspace空间。他们仅适用于热点虚拟机。JRockit VM使用本地堆处理类元数据相关数据。

JRockit VM倾向于使用更多的本地内存来换取更好的性能。JRockit没有一个解释模式,只有编译,所以由于它的额外的本机内存需求,进程大小往往使用比同等的Sun JVM大小大几百MB。

这应该不是一个大问题,除非您使用具有大型Java堆要求的32位JRockit;在这种情况下,JRockit虚拟机由于本机堆耗尽导致的内存错误的风险更高(例如对于32位虚拟机,Java堆越大,本机堆剩余的内存更小)。Oracle作为热点spot和JRockit产品线的供应商,其战略是将两个视频管理系统合并到一个JVM项目中,该项目将包含每个项目的最佳特性。这也将简化JVM调优,因为目前不理解这2VM之间的差异可能会导致糟糕的调优建议和性能问题。

关于正确的Java堆大小的提示

由于Java堆容量和调优不足,可能会出现多种性能问题。帮助您确定当前或新的生产环境的最佳Java堆大小,作为起点。其中一些技巧对于预防和解决内存外错误问题也非常有用,包括内存泄漏。

JVM —— 你总是害怕你不理解的东西

如何期望配置、调整和排除您不了解的问题?您可能永远没有机会编写和改进Java VM规范,但您仍然可以自由地学习它的基础,以提高您的知识和故障排除技能。有些人可能不同意,但从我看来,认为Java程序员不需要知道内部JVM内存管理的想法是一种错觉。

Java VM内存管理比通过-xmx尽可能地设置最大的价值要复杂得多。您必须从各个角度来看,包括您的本地和PermGen空间需求,以及来自物理主机的物理内存可用性(和CPU内核)。

操作系统位数

  • 32位JVM来说,这尤其棘手,因为Java Heap和本机Heap正在竞争中。您的Java堆越大,本地堆就越小。尝试为一个32位虚拟机设置一个大的堆,例如2.5GB+会增加本机内存错误的风险,这取决于您的应用程序占用、线程数量等。
  • 64位JVM解决了这个问题,但您仍然仅限于物理资源的可用性和垃圾收集开销(主要GC收集的成本随着大小的增加而上升)。底线是越大并不总是越好,所以请不要假设您可以在一个16GB 64位JVM 上运行所有的20个Java EE应用程序。

业务流量设置规则:检查动态内存占用需求

您的业务流量通常会决定您的动态内存占用空间。并发用户和请求生成JVM GC“心跳”,您可以从各种监视工具中观察到,因为短期和长期寿命对象的创建和垃圾收集非常频繁。

"正如您在上面的JVM图中看到的,Young Generation(年轻代)和Old Generation(老年代)的比例通常为1:3,或者是33%。对于典型的32位JVM,当设置Java Heap大小为2GB时(使用分代和并发收集器),通常会分配500MB给YoungGen空间,而OldGen空间则分配1.5GB。

尽可能减少主要的GC集合频率是实现最佳性能的关键因素,因此理解并估计在峰值负载期间需要多少内存非常重要。同时,您的应用程序和数据类型将决定您需要的内存量。对于需要大量Java堆和大量OldGen空间的应用程序,例如处理大型和非序列化会话数据(long-lived objects)的购物车类型应用程序,通常需要大量内存。而对于无状态和处理大量短命对象的XML应用程序,适当的YoungGen空间则至关重要,以最大程度地减少主要集合的频率。"

相关文章
|
3月前
|
存储 监控 Java
JVM实战—8.如何分析jstat统计来定位GC
本文详细介绍了使用jstat、jmap和jhat等工具分析JVM运行状况的方法,以及如何合理优化JVM性能。内容涵盖新生代与老年代对象增长速率、Young GC和Full GC的触发频率及耗时等关键指标的分析。通过模拟BI系统和计算系统的案例,展示了如何根据实际场景调整JVM参数以减少FGC频率,提升系统性能。最后汇总了常见问题及其解决方案,帮助开发者更好地理解和优化JVM运行状态。
JVM实战—8.如何分析jstat统计来定位GC
|
13天前
|
Java API 微服务
2025 年 Java 核心技术全面升级与实战应用详解
这份Java校招实操内容结合了最新技术趋势,涵盖核心技术、微服务架构、响应式编程、DevOps及前沿技术等六大模块。从函数式编程到Spring Cloud微服务,再到容器化与Kubernetes部署,帮助你掌握企业级开发技能。同时,提供AI集成、区块链实践和面试技巧,包括高频算法题与系统设计案例。通过学习这些内容,可应对90%以上的Java校招技术面试,并快速上手实际项目开发。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
101 41
|
3月前
|
缓存 监控 算法
JVM实战—10.MAT的使用和JVM优化总结
本文详细探讨了JVM内存管理与性能优化的关键问题。首先分析了线上大促活动引发的老年代内存泄漏及频繁FGC问题,通过MAT工具定位到本地缓存未正确处理的原因,并提出使用Ehcache等框架解决。接着讨论了百万级数据误处理导致的频繁FGC案例,深入剖析String.split()方法在特定JDK版本下的内存消耗问题,并给出多线程并发处理大数据量的优化建议。文章还总结了JVM运行原理、GC机制以及YGC和FGC的触发条件,明确了正常系统GC频率指标。最后提供了JVM性能优化的整体思路,包括新系统开发时的参数预估、压测后的调整策略以及线上系统的监控方法,同时列举了常见的FGC原因及对应解决方案。
215 79
JVM实战—10.MAT的使用和JVM优化总结
|
2月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
273 70
|
3月前
|
消息中间件 缓存 Java
JVM实战—11.OOM的原因和模拟以及案例
本文详细探讨了Java系统中内存溢出(OutOfMemory,简称OOM)问题的成因与解决方法。首先分析了线上系统因OOM挂掉的常见场景及处理思路,接着深入讲解了JVM中可能发生OOM的三大区域:Metaspace(类信息存储区)、栈内存(线程执行方法时使用)和堆内存(对象存储区)。针对每个区域,文章通过具体代码示例模拟了内存溢出的情况,如动态生成过多类导致Metaspace溢出、无限递归调用引发栈内存溢出以及高负载下堆内存不足等问题。最后结合实际案例,如大数据处理系统因Kafka故障未正确处理数据缓存而导致OOM,以及无限循环调用或未缓存动态代理类引发的问题,给出了预防和改进措施。
289 64
JVM实战—11.OOM的原因和模拟以及案例
|
18天前
|
存储 安全 Java
现代应用场景中 Java 集合框架的核心技术与实践要点
本内容聚焦Java 17及最新技术趋势,通过实例解析Java集合框架的高级用法与性能优化。涵盖Record类简化数据模型、集合工厂方法创建不可变集合、HashMap初始容量调优、ConcurrentHashMap高效并发处理、Stream API复杂数据操作与并行流、TreeMap自定义排序等核心知识点。同时引入JMH微基准测试与VisualVM工具分析性能,总结现代集合框架最佳实践,如泛型使用、合适集合类型选择及线程安全策略。结合实际案例,助你深入掌握Java集合框架的高效应用与优化技巧。
40 4
|
2月前
|
人工智能 Java 程序员
Java程序员在AI时代必会的技术:Spring AI
在AI时代,Java程序员需掌握Spring AI技术以提升竞争力。Spring AI是Spring框架在AI领域的延伸,支持自然语言处理、机器学习集成与自动化决策等场景。它简化开发流程,无缝集成Spring生态,并提供对多种AI服务(如OpenAI、阿里云通义千问)的支持。本文介绍Spring AI核心概念、应用场景及开发步骤,含代码示例,助你快速入门并构建智能化应用,把握AI时代的机遇。
|
3月前
|
存储 监控 Java
JVM实战—7.如何模拟GC场景并阅读GC日志
本文主要介绍了:如何动手模拟出频繁Young GC的场景、JVM的Young GC日志应该怎么看、编写代码模拟动态年龄判定规则进入老年代、编写代码模拟S区放不下部分进入老年代、JVM的Full GC日志应该怎么看。
131 16
JVM实战—7.如何模拟GC场景并阅读GC日志
|
3月前
|
消息中间件 存储 算法
JVM实战—6.频繁YGC和频繁FGC的后果
本文详细探讨了JVM中的GC机制及其优化策略,涵盖Young GC、Old GC和Full GC的触发条件与影响。首先分析了JVM GC可能导致系统卡顿的问题,特别是大内存机器上的YGC性能瓶颈,并通过G1垃圾回收器解决。接着通过实际案例展示了频繁FGC的成因及优化方法,如调整新生代与老年代内存比例或使用大内存机器。最后总结了不同GC算法的适用场景及对象生命周期特点,为JVM性能调优提供了实用指导。
261 15
JVM实战—6.频繁YGC和频繁FGC的后果
|
3月前
|
SQL 缓存 监控
JVM实战—9.线上FGC的几种案例
本文详细探讨了JVM性能优化中的几个关键案例与问题。首先分析了如何优化每秒十万QPS的社交APP,通过增加Survivor区大小和优化内存碎片解决频繁Full GC的问题。接着讨论了垂直电商后台系统FGC的深度优化,定制JVM参数模板以降低GC频率。还探讨了不合理设置JVM参数导致频繁FGC的情况,并提出了解决方案。此外,针对线上系统每天数十次FGC的问题,定位到大对象是主要原因,并通过调整新生代大小等参数优化。同时,分析了电商大促活动中因System.gc()调用导致系统卡死的现象,建议禁用显式GC。
231 10
JVM实战—9.线上FGC的几种案例