近来公司的服务器内存占用很大,运行一段时间,gc就占用cpu 100%,然后tomcat拒绝访问。
本地调试了几天,代码实在看不出问题。网上搜索了大量的文章研读,必须江南白衣,和javaeye上关于gc的文章,对服务器进行调试,还是没用。
服务器上才gc日志如下:
210.970: [CMS-concurrent-mark-start]
211.266: [CMS-concurrent-mark: 0.211/0.295 secs] [Times: user=0.49 sys=0.00, real=0.29 secs]
211.266: [CMS-concurrent-preclean-start]
211.270: [CMS-concurrent-preclean: 0.004/0.004 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
211.270: [CMS-concurrent-abortable-preclean-start]
215.141: [CMS-concurrent-abortable-preclean: 1.351/3.871 secs] [Times: user=2.64 sys=0.11, real=3.87 secs]
215.142: [GC[YG occupancy: 132189 K (235968 K)]
215.142: [Rescan (parallel) , 0.0644930 secs]
215.207: [weak refs processing, 0.1014540 secs] [1 CMS-remark: 135253K(262144K)] 267442K(498112K), 0.1661810 secs] [Times: user=0.30 sys=0.00, real=0.16 secs]
215.308: [CMS-concurrent-sweep-start]
215.419: [CMS-concurrent-sweep: 0.108/0.111 secs] [Times: user=0.14 sys=0.02, real=0.11 secs]
215.419: [CMS-concurrent-reset-start]
215.448: [CMS-concurrent-reset: 0.029/0.029 secs] [Times: user=0.04 sys=0.02, real=0.03 secs]
无奈,用jprofiler调试,过滤程序中所有使用过的pojo,发现凡是jsp用了 <c:forEach...这个标签的,每刷新一次,所用的model类的实例就会增加,在jprofiler中手工点击垃圾回收按钮后,回收不了。但是其他的地方,都可以回收。
通过jprofiler追踪引用,最好追踪到对应的jsp的编译后的文件,下面是部分代码
private boolean _jspx_meth_c_005fforEach_005f2(PageContext _jspx_page_context)
throws Throwable {
PageContext pageContext = _jspx_page_context;
JspWriter out = _jspx_page_context.getOut();
// c:forEach
org.apache.taglibs.standard.tag.rt.core.ForEachTag _jspx_th_c_005fforEach_005f2 = (org.apache.taglibs.standard.tag.rt.core.ForEachTag) _005fjspx_005ftagPool_005fc_005fforEach_0026_005fvar_005fitems.get(org.apache.taglibs.standard.tag.rt.core.ForEachTag.class);
_jspx_th_c_005fforEach_005f2.setPageContext(_jspx_page_context);
_jspx_th_c_005fforEach_005f2.setParent(null);
// /html/study/setMustCourse/orgListCourse.jsp(22,3) name = var type = java.lang.String reqTime = false required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
_jspx_th_c_005fforEach_005f2.setVar("orgCourse");
// /html/study/setMustCourse/orgListCourse.jsp(22,3) name = items type = java.lang.Object reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
_jspx_th_c_005fforEach_005f2.setItems((java.lang.Object) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${courseInfoList}", java.lang.Object.class, (PageContext)_jspx_page_context, null, false));
//在这里把request中courseInfoList赋值给_jspx_th_c_005fforEach_005f2的item属性。
int[] _jspx_push_body_count_c_005fforEach_005f2 = new int[] { 0 };
try {
int _jspx_eval_c_005fforEach_005f2 = _jspx_th_c_005fforEach_005f2.doStartTag();
if (_jspx_eval_c_005fforEach_005f2 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
do {
out.write("\r\n");
out.write("\t\t\t\t<option style=\"color:blue\" value='");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${orgCourse.courseId}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write("' title=\"");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${orgCourse.courseTitle}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write('"');
out.write('>');
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${orgCourse.courseCode}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${orgCourse.courseTitle}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write(" </option>\r\n");
out.write("\t\t\t");
int evalDoAfterBody = _jspx_th_c_005fforEach_005f2.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
}
if (_jspx_th_c_005fforEach_005f2.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
return true;
}
} catch (Throwable _jspx_exception) {
while (_jspx_push_body_count_c_005fforEach_005f2[0]-- > 0)
out = _jspx_page_context.popBody();
_jspx_th_c_005fforEach_005f2.doCatch(_jspx_exception);
} finally {
_jspx_th_c_005fforEach_005f2.doFinally(); //在这里进行属性的清除
_005fjspx_005ftagPool_005fc_005fforEach_0026_005fvar_005fitems.reuse(_jspx_th_c_005fforEach_005f2);
}
return false;
}
无奈,下载apache standard的源代码,发现javax.servlet.jsp.jstl.core.LoopTagSupport类中代码如下:
public void doFinally() {
/*
* Make sure to un-expose variables, restoring them to their
* prior values, if applicable.
*/
unExposeVariables();
}
}
没有对item属性清除。
于是hack子类 ForEachSupport的代码,增加了一个方法
public void doFinally() {
super.doFinally();
items = null;
rawItems = null;
}
然后用jprofiler进行测试,发现可以回收了。
存在的疑问如下:
1. ForEachSupport类,本身有个realease方法,貌似一直没有执行
public void release() {
super.release();
items = null;
rawItems = null;
}
2. c:forEach标签真的存在内存泄露问题?
3. java gc时的触发点是什么?在什么情况下会出现“CMS-concurrent-abortable-preclean-start]”这个问题?
4. 下面那几句话具体什么意思?
215.308: [CMS-concurrent-sweep-start]
215.419: [CMS-concurrent-sweep: 0.108/0.111 secs] [Times: user=0.14 sys=0.02, real=0.11 secs]
215.419: [CMS-concurrent-reset-start]
215.448: [CMS-concurrent-reset: 0.029/0.029 secs] [Times: user=0.04 sys=0.02, real=0.03 secs]
5. 如果程序不存在内存泄露的情况,在服务器运行一段时间之后,如果进行full gc,服务器占用内存是不是应该等于服务器刚刚重启后占用的内存?
( tomcat 6, spring+struts+hibernate,没有使用2级缓存,没有使用lazy加载,采用的是appfuse1.9的架构)
分享到:
- 2008-11-06 17:48
- 浏览 2262
- 评论(4)
- 论坛回复 / 浏览 (4 / 4837)
- 查看更多
相关推荐
第五次作业函数第一题--
本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。
机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip
python烟花代码
附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。
商业化产品经理,到底如何实现产品商业化?.docx
Panduit 工业以太网部件内部销售指南
在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。
常用品牌EPLAN部件库
单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌
Q1.ipynb
(自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip
Bematech 激光扫描器用户手册
激励视频接入文档.pdf
java jdk1.8 202版本下载window linux打包
Lite Beam M5快速指南
互联网金融导论.docx
字节跳动青训营——抖音项目
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。