背景:
做一个网站的时候,发现服务器上一段时间特别不稳定,每隔一段时间就会报”OutOfMemoryError: PermGen space”错误,于是网站也就歇菜了.
部署环境:windows2003,tomcat6.0,spring mvc2.5
辅助分析工具:jprofile6,visualvm,mat
分析过程:
1.自我检查阶段。由于是报perm区异常,我首先想到,系统默认perm区太小,想想应该要调整perm区大小,打开catalina.bat,设置了JAVA_OPTS,
JAVA_OPTS="-server -Xms512m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=784m"
这样设置后,模拟歇菜时候的情况进行压力测试,发现蛮稳定的,没有出现什么问题,这时又仔细检查代码,根本就没有出现频繁创建不可回收的垃圾对象,于是就先这样吧。过了一段时间发现又出问题了,还是perm溢出。
接着我计算下perm区已经够大了,怎么还会报这个异常,此时非常迷茫中....
2.工具辅助分析。visualvm 利用visualvm看看perm区是否真的像传说中说的那样---"perm溢出了",
看来还是老实点用apache自带的工具做压力测试看看是不是这个地方引起的
测试工具用apache自带的 ./ab -n 100000 -c 40 http://www.tongzhuangweb.com/class/kw-童卫衣.html
40个并发的时候perm区在30m处跌停,基本保持0增长。看来和perm区没关系。
perm区
看下heap区发现问题了 40并发下到后来基本保持5分钟一次full gc了,这样开心啊,原来heap区出问题了,多个应用放在一个tomcat里的时候,如果一个应用正好这样了,
刚开始的heap,好像也没什么问题,郁闷了~~~继续迷茫~~~~只能等待,等着出问题吧...半个小时过去了,还是这样....
突然发现惊喜了。。。如图
内存占用居高不下,这下就好分析了
于是赶紧用jprofile看看是哪个类造反,赶紧收拾了,只能看到都是大对象map,也只有list页面的数据暴露在页面上的这个map最大,不过每次请求结束后应该都能自动回收掉吧,但是却回收不了,感觉有点奇怪,不应该啊~~~,但是又看不到是什么对象造成这么多大对象map...
3.定位问题。只能用mat工具分析了,过了好久,终于发现惊喜了,如图
原来有那么session霸占这map对象,网站根本就没有使用session,这么单纯的网站和session有啥关系呢,日了日了。。。我以前还一直以为只有动态存放session内容的时候,才会创建session对象,这下才明白一点...
Servlet协议描述如下:
getSession(boolean create)方法:
javax.servlet.http.HttpServletRequest.getSession(boolean create)
Returns the current HttpSession associated with this request or, if if there is no current session and create is true, returns a new session.
If create is false and the request has no valid HttpSession, this method returns null.
To make sure the session is properly maintained, you must call this method before the response is committed.
简单地说:当create变量为true时,如果当前Session不存在,创建一个新的Session并且返回.(session创建机制:http://daihaixiang.blog.163.com/blog/static/3830134201011110537275/)
4.解决问题。
仔细看了session创建机制和tomcat这部分的代码,发现可以设置session超时时间,试试设置了后会如何?结果如下
看到每5分钟出现一个小三角 好开心,说明有效果了 因为有部分session被和谐了,接着就要如何取消session了,在我这个只是没有用户管理之类功能的单纯网站来说把session和谐掉才是良策。org.apache.catalina.connector.Request.getSession(),最终调用的是doGetSession(boolean create)方法,这部分代码也告诉我们如何和谐session:
1.重写sessionManager 全部都和谐掉 然后修改Tomcat的配置文件 也可以做到的
2.调用request.getSession().invalidate(); 方法,具体为啥调用这段 代码,有兴趣可以看下Request.getSession()里的源码,这样可以达到不使用session
3.设置jsp页面session参数 <%@ page session="false" language="java" pageEncoding="UTF-8" %>
和谐了session后,发现这个问题就解决了,如图
正常了
分享到:
相关推荐
- 特别是在大数据量处理场景下,如大量查询返回结果时,如果一次性加载过多数据到内存,可能会导致内存溢出。 #### 具体案例分析 1. **Hibernate查询优化**: - 在使用Hibernate进行数据库查询时,如果一次性...
#### 七、及时释放内存空间 释放内存可以通过以下几种方式实现: 1. 重启计算机是最简单有效的方法; 2. 关闭不再使用的程序; 3. 如果剪贴板中存储了图像资料,建议替换为文本以释放内存。 #### 八、优化内存中...
这样既能够充分利用物理内存,又能避免内存溢出的风险。 #### 3. 禁用页面文件 对于配备了足够多物理内存(例如512MB以上)的计算机来说,禁用页面文件可以进一步提高性能。这是因为,当物理内存充足时,使用虚拟...
4. Visual Studio Team System Test和Profiling:强大的测试和性能分析工具,可在测试环境中重现问题并进行性能分析。 5. TinyGet 和 Performance Monitor:用于监控系统性能和网络活动。 在解决性能问题时,我们...
在批量更新时,如果不及时清除一级缓存,可能会导致内存溢出异常。因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个...
1.3.1.1 VirtualMemoryDiagnostics:这个设置用于监控虚拟内存使用情况,有助于诊断内存溢出等问题,合理设置可以提前发现并解决性能瓶颈。 1.3.1.2 MaxCachedQueries:预定义的最大缓存查询数量,通过增加此值,...
- 应用程序代码优化:检查并改进可能导致性能瓶颈的代码段,如过度使用数据库查询或资源未及时释放。 在进行WebLogic Server 8.1性能调优时,还需要持续监控系统状态,如CPU利用率、内存使用情况、网络流量和...
传统的Hibernate数据插入方式往往采用单次插入单个实体对象的方式,这在处理小规模数据时效率尚可,但在处理成千上万乃至百万级别的数据时,则显得力不从心,甚至可能导致内存溢出等问题。解决这一问题的关键在于...
这可能导致服务器内存溢出,因为容器(如 Tomcat、Jetty)会在每个新会话中分配内存。正确的做法是复用 HttpClient 实例,减少内存开销。 2. 不优雅二:不必要的请求配置每次设置。如果所有请求的超时时间相同,应...
未正确管理可能导致数据冲突或内存溢出。了解它们的生命周期,及时清理不再使用的Session数据,并控制Application数据量。 7. **代码组织与结构**:ASP页面中混合了大量的HTML和脚本,这可能导致代码难以维护。使用...
1. **数据分块处理**:在处理大量数据时,一次性加载所有数据到内存会导致内存溢出。采用分块处理,每次只处理一部分数据,可以有效降低内存消耗。例如,可以设置每次读取或写入1000条数据,然后循环处理直到完成...
过高或不稳定的资源利用率可能会影响数据库的性能,需要及时调整资源分配。 2. **数据库实例状态**:检查数据库是否正常启动,无异常挂起或错误信息。通过`v$session`、`v$process`视图可以查看当前活动会话和进程...
2. **内存缓存**:过多的图片数据存储在内存中会导致内存溢出。可以限制缓存大小,或者使用异步处理图片来避免。 3. **静态引用**:避免静态变量持有Camera对象,这可能导致对象无法被垃圾回收。 4. **生命周期...
这样可以有效地避免内存溢出的问题。 2. **使用Session的缓存机制**:利用Hibernate的二级缓存功能来缓存待插入的数据,减少与数据库的交互次数,提高性能。 3. **清理Session缓存**:在完成一次批量插入后,及时...
1. **内存管理**:在大量数据处理时,一次性加载整个Excel文件可能导致内存溢出。我们可以使用流式处理,一次读取或写入一行数据,减少内存占用。Apache POI提供了SXSSF API(Streaming Usermodel API),适用于大...
- **状态管理优化**:对于有状态Bean,尽量减少保存的状态信息,及时释放不再需要的状态,以降低资源消耗。 - **池化管理**:使用Bean池可以提高效率,但需注意平衡池大小与系统负载的关系。 - **测试与监控**:对...
- **非持久化消息**:默认情况下存储在内存中,当内存不足时会溢出到临时文件中。 - **持久化消息**:始终存储在磁盘文件中,重启后可以从磁盘恢复。 ##### 实验情况分析 - **持久化消息限制**:设置持久化消息的...
- **控制读取外部输入流大小:** 控制文件或网络输入流的读取大小,避免内存溢出。 - **上传文件验证:** 对上传文件进行大小限制和类型验证。 - **循环中避免使用低性能方式拼接字符串:** 使用StringBuilder或...
在处理海量数据时,Hibernate作为一款强大的ORM框架,其默认机制并不适合直接处理大量记录,因为这可能导致内存消耗过大和性能下降。以下是针对Hibernate批量处理海量数据的一些关键知识点和优化策略: 1. **理解...