没有合适的资源?快使用搜索试试~ 我知道了~
JavaEE_performance_problem.doc
需积分: 0 5 下载量 38 浏览量
2009-09-04
00:06:11
上传
评论
收藏 398KB DOC 举报
温馨提示
试读
20页
JavaEE_performance_problem.doc 人家写的,好东西共享
资源详情
资源评论
资源推荐
Java EE(Java 企业开发平台)应用程序,无论应用程序服务器如何部署,所面对的一系列
问题大致相同。作为一个 JAVA EE 问题解决专家,我曾经面对过众多的环境同时也写了不
少常见问题的观察报告。在这方面,我觉得我很象一个汽车修理工人:你告诉修理工人发动
机有声音,他就会询问你一系列的问题,帮你回忆发动机运行的情形。从这些信息中,他
寻找到可能引起问题的原因。
众多解决问题的方法思路基本相同,第一天我同要解决问题的客户接触,接触的时候,我
会寻找已经出现的问题以及造成的负面的影响。了解应用程序的体系结构和问题表现出的
症状,这些工作很够很大程度上提高我解决问题的几率。在这一节,我分享我在这个领域
遇过的常见问题和他们的症状。希望这篇文章能成为你 JAVA EE 的故障检测手册。
内存溢出错误
最常见的折磨着企业级应用程序的错误是让人恐惧的 outofmemoryError(内存溢出错误),
这个错误引起下面这些典型的症状:
◆应用服务器崩溃
◆性能下降
◆一个看起来好像无法结束的死循环在重复不断的执行垃圾收集,它会导致程序停止运行,
并且经常导致
应用服务器崩溃
不管症状是什么,如果你想让程序恢复正常运行,你一般都需要重新启动应用服务器。
引发 out-of-memory 错误的原因
在你打算解决 out-of-memory 错误之前,首先了解为什么会引发这个错误对你有很大的
帮助。如果 JVM 里运行的程序, 它的内存堆和持久存储区域的都满了,这个时候程序还想
创建对象实例的话,垃圾收集器就会启动,试图释放足够的内存来创建这个对象。这个时
候如果垃圾收集器没有能力释放出足够的内存,它就会抛出 OutOfMemoryError 内存溢
出错误。
Out-of-memory 错误一般是 JAVA 内存泄漏引起的。回忆上面所讨论的内容,内存泄漏
的原因是一个对象虽然不被使用了,但是依然还有对象引用他。当一个对象不再被使用时,
但是依然有一个或多个对象引用这个对象,因此垃圾收集器就不会释放它所占据的内存。
这块内存就被占用了,堆中也就少了块可用的空间。在 WEB REQUESTS 中这种类型的的
内存泄漏很典型,一两个内存对象的泄漏可能不会导致程序服务器的崩溃,但是 10000
或者 20000 个就可能会导致这个恶果。而且,大多数这些泄漏的对象并不是象 DOUBLE
或者 INTEGER 这样的简单对象,而可能是存在于堆中一系列相关的对象。例如,你可能
在不经意间引用了一个 Person 对象,但是这个对象包含一个 Pro*le 对象,此对象还包含
了许多拥有一系列数据的 PerformanceReview 对象。这样不只是丢失了那个 Person 对
象所占据的 100 bytes 的内存,你丢失了这一系列相关对象所占据的内存空间,可能是高
达 500KB 甚至更多。
为了寻找这个问题的真正根源,你需要判断是内存泄漏还是以 OutOfMemoryError 形式
出现的其他一些故障。我使用以下 2 种方法来判断:
◆深入分析内存数据
◆观察堆的增长方式
不同 JVM(JAVA 虚拟机)的调整程序的运作方式是不相同的,例如 SUN 和 IBM 的 JVM,但
都有相同的的地方。
SUN JVM 的内存管理方式
SUN 的 JVM 是类似人类家族,也就是在一个地方创建对象,在它长期占据空间之前给它
多次死亡的机会。
SUN JVM 会划分为:
1、年轻的一代(Young generation),包括 EDEN 和 2 个幸存者空间(出发地和目的地
the From space and the To space)
2、老一代(Old generation)
3、永久的一代(Permanent generation)
9
图 1:解释了 SUN 堆的家族和空间的详细分类
对象在 EDEN 出生就是被创建,当 EDEN 满了的时候,垃圾收集器就把所有在 EDEN 中的
对象扫描一次,把所有有效的对象拷贝到第一个幸存者空间,同时把无效的对象所占用的
空间释放。当 EDEN 再次变满了的时候,就启动移动程序把 EDEN 中有效的对象拷贝到第
二个幸存者空间,同时,也将第一个幸存者空间中的有效对象拷贝到第二个幸存者空间。
如果填充到第二个生存者空间中的有效对象被第一个生存者空间或 EDEN 中的对象引用,
那么这些对象就是长期存在的(也就是说,他们被拷贝到老一代)。若垃圾收集器依据这种
小幅度的调整收集(minor collection)不能找出足够的空间,就是象这样的拷贝收集
(copy collection),就运行大幅度的收集,就是让所有的东西停止(stop-the-world
collection)。运行这个大幅度的调整收集时,垃圾收集器就停止所有在堆中运行的线程并
执行清除动作(mark-and-sweep collection),把新一代空间释放空并准备重启程序。
图 2 和图 3 展示的是了小幅度收集如何运行
剩余19页未读,继续阅读
CarreraChina
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0