[开发]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的性能。
[开发]resin+spring+struts配搭在线上常见的三个问题相关推荐
- Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架
Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...
- 每日一皮:产品和开发在线上吵了许久...
产品和开发在线上吵了许久 于是领导开了一个会议室让他们聊聊 - 往期推荐 每日一皮:软件从业人员表情图... 每日一皮:强大的sudo ... 每日一皮:周六了,想跟你说一句... 每日一皮:一个难以 ...
- Spring Boot(5) web开发(3)拦截器、文件上传、异常处理
Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...
- GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)...
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...
- 吐血推荐那些提升开发人员工作效率的在线工具|文末抽书
来源 :公众号 | 作者 :Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的. Holli ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...
- 解释spring,struts,hibernate优缺点
解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展 ...
- 吐血推荐 | 那些提升开发人员工作效率的在线工具
导读:Java开发人员经常要和各种各样的工具打交道,除了常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的.本文作者Hollis偏爱使用在线工具,因为这样比较方便.本文就 ...
- 【Spring开发】—— Spring Core
原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...
最新文章
- IOS开发控制器之间传值的几种小方法
- 高并发高负载网站的系统架构
- 关于intent-filter的误区
- Manacher算法学习笔记 | LeetCode#5
- CF755G PolandBall and Many Other Balls(多项式/倍增fft)
- 酷黑风个人主页+引导页
- mysql中phpmyadmin安装教程_phpmyadmin安装方法
- matlab如何矩阵相除,Matlab中的矩阵除法有问题???
- 59.Linux/Unix 系统编程手册(下) -- SOCKET: Internet Domain
- canvas视频逐帧播放
- 打开相机用鼠标画框,画下一个时上一个消失
- java web参考文献_javaweb外文参考文献
- 2021-05-19 C语言逻辑取反! 学习
- 怎么使用水经注万能地图下载器制作百度个性化地图-人造区域篇
- vue.js入门以及和echarts整合之柱状图和中国地图
- luci html 页面,luci界面修改
- 离散数学模拟微信红包算法升级版
- 【织恋袜业】一双袜子的数字化之路——写在第十四届中国·大唐国际袜业博览会开幕前(下)
- Mybatis学习笔记(尚硅谷版整理)
- SpringCloud之Eureka客户端服务启动报Cannot execute request on any known server解决