[开发]resin+spring+struts配搭在线上常见的三个问题

郑昀 201102

1、文件句柄数问题

现象1:访问页面出现500错误,错误描述为:java.lang.NoClassDefFoundError,后面跟的类名各式各样不一一列举了。

现象2:Resin被Wathcdog自动重启,日志中表明这是因为:Resin shutdown from out of file descriptors

分析:由于Linux默认文件句柄限制为1024(通过命令ulimit –n来查看),所以当Web Server应对高负载起了大量线程,incoming socket connections和outgoing socket connections都很多,而且后台代码也可能涉及大量句柄打开,尤其是struts+spring组合。

因此当句柄数迅速到达1024的限制后,无法打开新句柄,于是乎文件打不开、类定义找不到,诸如此类的错误就出现了。

解决:

短期策略是调大Linux下对文件句柄数限制。操作如附录1所示。对于这个数字,一般建议是32667,也可以设置的更大,我们直接调为51200。

 

2、PermSize问题

现象:Resin被持续访问一段时间后,比如一天,就会报告如下500错误,导致所有页面不能访问:

    OutOfMemoryError:PermGen space

此时,就只能重启机器了,重启resin都没用。

分析:因为线上用了spring+struts,这些框架用到大量动态class,ClassLoader是把这部分内存放在PermGen space里的。而JVM的GC是不会清理PermGen space的。这样很容易导致线上应用报告PermGen space内存溢出。

解决:通过在resin.xml中增加jvm-arg一系列参数,调大“PermSize”和“MaxPermSize”这两个参数来尽量避免出现JVM内存永久保存区域溢出错误。PermSize默认值参考附录2。修改情况参见附录3。

 

3、Xmx和Xms问题

现象:Resin报告如下500错误,导致所有页面不能访问:

    OutOfMemoryError:Java heap space

此时重启resin还可以恢复。

分析:JVM默认的最大可用内存(-Xmx参数)和初始堆大小(-Xms参数)都偏小,很容易限制住服务器的能力。当Java架构的能力还没有发挥出来时,就已经被系统默认的各种参数限制住了,导致各种各样的异常。

解决:通过在resin.xml中增加jvm-arg一系列参数,调大“Xms”和“Xmx”以及“Xmn”这三个参数。修改情况参见附录3。Xmn附录4。

其中Xmx的值可以设置得很大,比如4096MB,跟你的物理内存大小差不太多都行,64位Linux支持得住。Xmn的值是Xmx数值的1/4。

Xms的值可以与Xmx一样,省得当压力上来后,初始堆大小发现不够,JVM又得花时间去把内存区大小扩到最大可用内存的数值,就在这个过程,持续不断的高负载可能已经将服务器冲垮。这个机理就类似于我们熟知的SQL Server要根据业务,仔细思考指定数据库空间初始值和最大值以及自增长模式。默认SQL Server数据库空间自动增长是按10%比例增加的:如果你最开始建库时分配了1GB空间,但当压力上来后,数据很快到达1GB,那么数据库就会先锁住所有请求,自动在磁盘上增长出100MB的空间,在这个自动增长过程,所有Web请求就会被挂住,最终可能全部超时

 

附录

附录1:

编辑/etc/profile,加入

ulimit -n 51200

有人认为设置为4096就可以,但在网络服务器上此数字最好调成几万,不然流量冲上来太容易冲破。

还有设置命令是:ulimit –SHn 51200,-S、-H这两个参数的说明如下:

-H 设置硬件资源限制。
-S 设置软件资源限制。
-n size:设置内核可以同时打开的文件描述符的最大值。

还有另一种操作修改三个地方的设置,参见《修改 Ubuntu ulimit 限制》。

 

附录2:

没有给resin.xml加PermSize的情况下,默认计算规则是:

“JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。”

那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;

四分之一是1024MB,这就是MaxPermSize默认大小。

 

附录3:

优化规则:Server端的JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/4。

线上resin 4.0.15的resin.xml中增加如下配置节点:

<server-default>

    <jvm-arg>-Xms4096m</jvm-arg>

    <jvm-arg>-Xmx4096m</jvm-arg>

    <jvm-arg>-Xmn1024m</jvm-arg>

    <jvm-arg>-XX:PermSize=128m</jvm-arg>

<jvm-arg>-XX:MaxPermSize=256m</jvm-arg>

    <thread-max>1024</thread-max>

    <socket-timeout>30s</socket-timeout>

    <keepalive-max>512</keepalive-max>

    <keepalive-timeout>60s</keepalive-timeout>

</server-default>

 

附录4:

JVM的-Xmn参数含义是Young Generation的heap size。

JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

时间: 2024-12-03 02:12:05

[开发]resin+spring+struts配搭在线上常见的三个问题的相关文章

MyEclipse5.1开发Spring Struts Hibernate应用时的数据库问题

使用Eclipse3.2+MyEclipse5.1开发Spring+Struts+Hibernate应用,使用自动生成的applicationContext.xml和hbm可能文件会出现以下两个问题:1.在进行数据库操作时,发生连接数据库错误,异常信息大致如下:org.hibernate.exception.GenericJDBCException: Cannot open connection        at org.hibernate.exception.ErrorCodeConvert

[开发]Resin 4.0.15配置优化的一个建议

郑昀 201102 早先说过线上Resin的配置文件中要增加线程池大小.各种timeout参数(resin 4.0.15的默认配置文件肯定没有这些参数,需要另行增加). 在resin 4.0.10里,有这么一个bug,thread-max的数量设置没有起作用:http://bugs.caucho.com/view.php?id=4251 ,但后面到了resin 4.0.15应该就修复了. 下面内容会给出背景介绍以及建议配置.   1.背景: 郑昀认为,要综合考虑resin线程池大小."-Xmx 

解释spring,struts,hibernate优缺点

解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录.文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复

【Spring开发】—— Spring Core

前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学习,更加深入的理解了Ioc和AOP的思想,并对其架构模块有了更深一步的理解. 刚开始翻看spring技术内幕,虽然有了一点看源码的经验,但是直接看如此深的源码,还是很头疼.spring由于业务的扩展,以及用户群的增加,对于某些模块的类封装的很深!因此追溯源码是个很头疼的问题,而直接看这本书,也是压力山大. 于是回去复习一下spring的基本知识,先学会走

Windows CE系统开发,BSP包中的几个常见文件详解

Windows CE系统开发,BSP包中的几个常见文件详解 BSP介绍(Board Support Package)是介于底层硬件和上层软件之间的底层软件开发包,它主要功能为屏蔽硬件,提供操作系统及硬件驱动,具体功能包括: (1)      单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持: (2)      为操作系统提供设备驱动程序和系统中断服务程序: (3)      定制操作系统的功能,为软件系统提供一个实时多任务的运行环境: (4)      初始化操作系统,为操作

Spring MVC 多文件上传大小限制及异常处理

Spring MVC  多文件上传大小限制及异常处理 (包括 MaxUploadSizeExceededException 异常) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 补充如下: h

8个对于Web设计和开发人员非常有用的在线工具

导读:作者Henry Jones写了一篇<8 Useful Online Tools for Web Designers and Developers>,现将译文<8个对于Web设计和开发人员非常有用的在线工具>转载,以下是文章内容: 在工作中借助一些非常好用的工具可以让你专注于更重要的事情,进而提高工作效率.本文收集了一些设计和开发相关的在线工具,分享给大家,希望对你有帮助. ProCSSor ProCSSor是一个很不错的CSS代码美化工具,它可以帮助你很轻松的把代码转换成很美

在线上我们开启了对话电商名家CEO之派代年会直通车

固定开场白:有中国电商领域"达沃斯论坛"之誉的派代电商年会将在今年8月28日盛世绽放!与以往不同,今年"破旧立新",在线上我们开启了对话电商名家CEO之"派代年会直通车",通过与他们的对话,从他们过去一年的变化中窥见未来中国电商之变局. 第三期[派代电商年会直通车]对话CEO,派代网有幸邀请到了大朴网CEO王治全先生. 切入正题 2006年王治全创立了库巴网,2012年被国美全资收购,同年8月28日大朴网上线,他开始了人生的第二次创业,专注于家居

Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序

本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅<Struts 2系列教程>来比较Struts 1.x和Struts 2.x的相同点和不同点. 一.本文给出的程序要实现什么功能 mystruts是一个录入和查询产品信息的程序.为了方便起见,本例中的产品信息表只包括了产品ID.产品名称和产品价格三个字段.mystruts的主要功能如下: 1.接受用户输入的产品ID.产品名称和产品价格. 2.验证这些字段的合法性.如果某些字段的输入不合法(如未输入产品ID),程序会for