Java EE应用中的性能问题解决方案 — 第一部分 内存溢出和JVM内幕(A)

声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!
Java EE的应用,无论部署至哪种应用服务器上,都可能遇到一些性能的问题。在此,我们将介绍一些通用的性能问题及解决方案。在性能调整和优化中,首先需要了解客户的问题。通过架构、现象等方面寻找可能影响Java EE性能的可能方面。所以本文中列举的是一些通用的问题,在实际的性能调整和优化中需要结合具体的情况来进行分析判断并做出相应调整。
 
内存溢出错误
最经常遇到的问题可能就是OutOfMemoryError了。这个错误经常缠绕着一些企业应用,让系统管理员觉得很可怕。通常,这个错误是以下一些现象的并发症:
应用服务器宕机
性能大幅降低
表象上出现无休止重复的垃圾收集,致使正常处理中断,并还可能造成应用服务器宕机
无论是什么现象,可能都需要重启应用服务器可能才能恢复正常。
 
导致内存溢出的原因
在解决内存溢出的错误前,首先要理解这是如何产生的。如果JVM在其进程内存空间没有内存可用(包括堆的各个区域、永久内存空间),而一个进程试图创建一个新的对象实例,垃圾收集线程就开始尝试释放足够的内存空间来放置新的对象。当垃圾收集线程无法释放足够的内存时,就抛出OutOfMemoryError。
 
内存溢出错误最有可能是由于Java的内存泄露造成的。有很多关于Java内存泄露的讨论,最后的定论就是Java的内存泄露来源于对未使用对象引用的延迟释放:也就是说已经完成了对该对象的使用,但是因为还存在着一个或者多个对象引用着该对象,所以垃圾收集线程就不能收回该片内存。由该对象占有着的内存即导致了可用堆空间的流失。这样的内存泄露通常发生在Web请求阶段,例如10000个用户并发访问,而每个请求中有一个或两个存在内存泄露的对象就有可能导致服务器崩溃。更为甚者的是,一般来说,发生内存泄露的对象都不是简单的对象(例如Integer、Double),而是在堆中要占据很多“子图”的对象。例如,有可能在不经意间引用了Person的对象,而Person的对象又引用了Profile的对象,而Profile的对象又引用了好几个PerformanceReview的对象。比起Person对象占据的100字节内存来说,在这个情况下完整的“子图”对象可能占据500K或者更多的内存。
 
为了从根本上解决问题,需要判断是真实存在内存泄露还是别的内容引起的OutOfMemoryError。有如下几个判断方法:
分析底层的内存统计信息
检查堆增长的方式
虽然Sun和IBM的JVM不一样,JVM的调优过程却有很多相同之处。
 
SUN JVM的内存管理
Sun的JVM是有“代沟”的(开玩笑,应该说是按代分片的),也就是说在一个空间(分片)中创建的对象在真正进入长期空间前都有好几次销毁的机会。Sun的JVM被明确地分成以下几个空间(分片):
新生代,包括Eden和两个生存空间(From空间和To空间)
老生代
永生代
 
如下图:
 

 
对象在Eden空间中创建,当Eden满后,垃圾收集线程遍历Eden中的所有对象,将活动对象拷贝至第一个生存空间,并将废对象的空间回收释放。当Eden再次充满时,垃圾收集线程就再来一遍,但将活动的对象拷贝至第二个生存空间,并将原来在第一个生存空间中的对象拷贝到第二个生存空间。如果第二个生存空间冲满后,一些留在Eden和第一个生存空间的对象就会被拷贝到老生代。当垃圾收集通过这种轻量级的方法(也称为“拷贝收集法”)不能获得足够内存的话,垃圾收集就会执行一次大规模收集,也叫“停滞收集法(stop-the-world collection)”。在这种收集法下,垃圾收集将所有线程挂起并在全堆范围内执行标记清扫收集,腾空整个新生代并准备重新开始进程。
 
拷贝收集法的运行方式图:

 

 
 
停滞收集法的运行图:
 

总的来说,对象在新生代创建,大部分都在此进行轮回,并不需要执行标记清扫收集。有一些对象上升至了老生代,因为它们活动的时间太长了,如果老生代也满了,就必须来一次标记清扫收集了。
可以看出,在Sun的实现中,老生代中的对象只能通过大规模的收集活动来收集,所以代价很高。所以需要确保对象生存的时间较短,这样在其还未进入老生代的时候就将其收集。
Java EE应用中的性能问题解决方案参考资料下载
声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/BU_BetterYou/archive/2008/05/27/2487241.aspx

Java EE 容器化部署的实践经验 本文旨在为Java EE开发者提供全面的容器化部署指导,涵盖从单体应用到微服务架构的容器化改造过程。Java EE应用容器化的必要性Docker和Kubernetes的技术整合生产环境中的最佳实践常见问题的解决方案本文首先介绍Java EE容器化的背景和核心概念,然后深入探讨技术实现细节,最后分享实际案例和经验总结。Java EE: Java Platform, Enterprise Edition,企业级Java平台容器化: 将应用及其依赖打包成标准化单元的技术Docker。 阅读详情

相关推荐

Java EE 应用的监控与运维

本文旨在为Java EE应用开发者、架构师和运维人员提供全面的监控与运维指南。内容涵盖从单体应用到微服务架构的监控策略,包括传统Java EE应用和现代云原生环境下的监控解决方案。文章首先介绍Java EE监控的基本概念,然后深入探讨各种监控技术和工具,接着通过实际案例展示监控系统的实现,最后讨论未来发展趋势。APM(Application Performance Management): 应用性能管理,用于监控和管理软件应用的性能和可用性JVM。

AI开发架构师 1156

JVM总结及常见问题解决方案

这篇博文总结的很好,可作为参考JVM总结 常见问题及解决可见JVM调优总结 JVM内存为什么要分成新生代、老年代 其实不分代也可以,但是分代是为了优化GC性能。如果不分代,所有对象都放在一块,那么GC的时候就要对堆的所有区域进行扫描,效率低下,因为很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空...

dandyjiew 329

Java EE 性能优化技巧:让你的应用飞起来

随着互联网用户规模的爆炸式增长,Java EE应用(如电商平台、金融系统)常面临“高并发卡慢”“资源耗尽崩溃”等问题。本文聚焦Java EE 6/7/8标准下的企业级应用,覆盖Servlet、EJB、JPA等核心组件,从数据库、缓存、线程、JVM、代码五个维度,总结可落地的性能优化技巧。用“餐厅运营”故事引出性能问题解释响应时间、吞吐量等核心指标分模块讲解数据库/缓存/线程/JVM/代码优化以电商订单系统为例演示完整优化流程推荐性能分析工具与未来趋势响应时间。

Java大师兄的博客 815

java常见的几种内存溢出和解决方案

项目组最近在开发中经常会出现一些意想不到的内存溢出问题。下面我就说说我们常见的几种内存溢出吧!1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap spaceJVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young...

weixin_33894640的博客 808

Java EE 应用的性能优化的误区与避免

Java EE(Java Platform, Enterprise Edition)是一种广泛应用于企业级开发的 Java 平台,其性能直接关系到企业应用的响应速度、吞吐量和用户体验。本文章的目的在于揭示 Java EE 应用性能优化过程中容易陷入的误区,并提供有效的避免方法。范围涵盖了 Java EE 应用从代码层面到服务器层面的性能优化相关内容。本文首先介绍核心概念,包括 Java EE 应用性能优化的基本概念和相关联系;接着阐述核心算法原理和具体操作步骤,通过 Python 代码示例进行说明;

Java大师兄的博客 1099

Java EE 应用的性能测试与评估

本文旨在为Java EE开发者、架构师和测试工程师提供一套完整的性能测试与评估方法论。我们将覆盖从测试计划制定到结果分析的完整流程,特别关注企业级Java应用的性能特性。本文首先介绍性能测试的基本概念,然后深入探讨Java EE特有的性能考量,接着详细介绍测试工具和方法,最后通过案例展示实际应用。吞吐量(Throughput): 系统在单位时间内处理的请求数量响应时间(Response Time): 从发送请求到接收响应的时间间隔并发用户数(Concurrent Users)

AI开发架构师 831

Java EE应用中的性能问题解决方案 — 第一部分 内存溢出和JVM内存管理内幕(B)

声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!IBM的JVM内存管理IBM的JVM稍有不同。与其从一个大的分片堆开始,它将所有的对象保留在单一空间中并在堆增长时释放内存。它通过运行不同层级的垃圾回收实现。主要的表现是:堆开始时相对较小,被填满,并在某时间点上执行简洁型的标记清扫垃圾回收来

BU_BetterYou的专栏 1158

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

JVM 发生 OOM 的 8 种原因、及解决办法

JVM 发生 OOM 的 8 种原因、及解决办法 转载:https://mp.weixin.qq.com/s/DIBkR-iRyPGEyyEsR_pNhA

Object的博客 610

常见卫星图源下载教程

上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。

锐多宝的地理空间 1万+

DeepSeek + 番茄小说:AI辅助小说开发最全指南

DeepSeek与番茄小说合作推出AI辅助小说创作系统,通过DeepSeek的文本生成能力(包括情节构建、角色塑造等)结合番茄小说的市场数据,为作者提供从创意到发布的全流程支持。系统包含智能创意生成器、角色设计、章节自动生成等核心模块,采用数据驱动优化策略,支持128K长文本处理和多风格模仿。开发架构采用Python+FastAPI技术栈,提供分层审核机制确保质量。该系统可帮助作者突破创作瓶颈,提升效率,同时提供订阅制、内容分成等多元变现模式。需注意版权问题和原创性保证。

weixin_41445009的博客 1673

Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)

层级关系:JVM是最底层,负责实际执行代码,是跨平台的基础。JRE= JVM + 基础类库。提供了运行环境。JDK= JRE + 开发工具。提供了开发环境。Java SE是一个平台规范,它包含了JDK和JRE,定义了Java的核心。是基于Java SE的一系列扩展规范,用于企业级开发。如何选择?只想运行Java程序:安装JRE即可(但现在JDK通常已捆绑JRE,直接装JDK也行)。想要开发Java程序:必须安装JDK。学习Java基础或做桌面开发:学习Java SE。

BillKu的博客 1232

深入解析uncompyle6反编译pyc文件及常见错误修复指南

本文深入解析了使用uncompyle6工具反编译Python字节码文件(.pyc)的完整流程。针对实践中最高频的KeyError和Python版本范围限制两大错误,提供了详细的修复方案与步骤指南,并分享了处理复杂反编译结果的高级技巧与安全实践,是进行代码恢复、调试与分析的重要参考。

uber9的博客 534

一次搞懂JDK、JRE、JVM、java EE、java SE

一次搞懂JDK、JRE、JVM、java EE、java SE一、名词解释二、JDK的版本三、JDK、JRE、JVM的关系四、JavaSE、JavaEE的区别 一、名词解释 JDK Java Development Kit,Java 软件开发工具包。 JRE Java Runtime Environment,Java 运行环境。 JVM Java Virtual Machine,Java 虚拟机。 二、JDK的版本 Java EE Java Enterprise Edition,Java 企业版 使

隔壁老王呀的专栏 2万+

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 652

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3033

Java SE vs Java EE 与 JVM vs JDK vs JRE

它包含了 JRE(Java Runtime Environment),以及编译器 javac 和其他工具,如 javadoc(文档生成器)、jdb(调试器)、jconsole(监控工具)、javap(反编译工具)等。简单来说,JRE 只包含运行 Java 程序所需的环境和类库,而 JDK 不仅包含 JRE,还包括用于开发和调试 Java 程序的工具。也就是说,可以用 jlink 根据自己的需求,创建一个更小的 runtime(运行时),而不是不管什么应用,都是同样的 JRE。,感兴趣的可以去看看。

CHEN_DA_PING的博客 991

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 456

Java EE应用中的性能问题解决方案 — 第一部分 内存溢出的解决办法及JVM内幕(D)

 声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利可能较多数量的对内存泄露的错误判断来自会话部分。会话部分并不会泄露任何内存。它消耗内存,表面上很像内存泄露,但最终会话内存还是会被回收的。如果应用服务器内存溢出,要想知道这个溢出情况是由于内存泄露引起的还是由于对会话管理不善造成的,最好的办法是停止对应用

BU_BetterYou的专栏 1713

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4724

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java EE性能问题解决办法-1

  这篇文章,是PRO JAVA EE 5 Performance Management and Optimization 的一个章节,作者Steven Haines分享了他在调优企业级JAVA应用时所遇到的常见问题。  Java EE(Java企业开发平台)应用程序,无论应用程序服务器如何部署,所面对的一系列问题大致相同。作为一个JAVAEE问题解决专家,我曾经面对过众多 的环境同时也写了不

leagle 1054

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java SE 和 Java EE 的区别

Java SE与Java EE核心区别摘要(150字) Java SE是Java标准版,提供JVM、核心类库(集合/IO/线程等)和基础开发工具,适用于桌面程序和控制台应用,是所有Java开发的基础。Java EE是企业版扩展规范,基于Java SE增加Servlet、JSP、EJB等API,专为分布式高并发系统设计(如电商/金融平台),需部署至Tomcat等服务器运行。学习路径必须先掌握Java SE,再进阶Java EE或相关框架(如Spring)。注意:2018年后Java EE更名为Jakarta

weixin_45784564的博客 576

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

5 款强大的 JVM 性能调优工具 ,好用爆了

现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。 本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。 一、 jps(Java V

javalingyu的博客 6538

Java EE 应用的性能优化的最佳时机

本部分旨在明确 Java EE 应用性能优化最佳时机研究的目的和涵盖范围。目的在于帮助开发者和企业准确把握性能优化的时间点,以最小的成本获取最大的性能提升。范围包括 Java EE 应用从开发到上线运营的整个生命周期,涉及不同阶段的性能优化策略和技术。本文将按照以下结构展开:首先介绍 Java EE 应用性能优化相关的核心概念和联系,接着阐述核心算法原理和具体操作步骤,然后给出数学模型和公式进行性能量化分析。通过项目实战案例展示性能优化的实际应用,介绍性能优化在不同场景中的应用情况。

Java大师兄的博客 752
上一篇: Java字节码揭秘——第四部分
下一篇: Java EE应用中的性能问题解决方案 — 第一部分 内存溢出的解决办法及JVM内幕(D) ...
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值