郑昀 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配搭在线上常见的三个问题相关推荐

  1. Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架

    Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...

  2. 每日一皮:产品和开发在线上吵了许久...

    产品和开发在线上吵了许久 于是领导开了一个会议室让他们聊聊 - 往期推荐 每日一皮:软件从业人员表情图... 每日一皮:强大的sudo ... 每日一皮:周六了,想跟你说一句... 每日一皮:一个难以 ...

  3. Spring Boot(5) web开发(3)拦截器、文件上传、异常处理

    Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...

  4. GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)...

    原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...

  5. 吐血推荐那些提升开发人员工作效率的在线工具|文末抽书

    来源 :公众号 | 作者 :Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的. Holli ...

  6. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...

  7. 解释spring,struts,hibernate优缺点

    解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展 ...

  8. 吐血推荐 | 那些提升开发人员工作效率的在线工具

    导读:Java开发人员经常要和各种各样的工具打交道,除了常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的.本文作者Hollis偏爱使用在线工具,因为这样比较方便.本文就 ...

  9. 【Spring开发】—— Spring Core

    原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...

最新文章

  1. IOS开发控制器之间传值的几种小方法
  2. 高并发高负载网站的系统架构
  3. 关于intent-filter的误区
  4. Manacher算法学习笔记 | LeetCode#5
  5. CF755G PolandBall and Many Other Balls(多项式/倍增fft)
  6. 酷黑风个人主页+引导页
  7. mysql中phpmyadmin安装教程_phpmyadmin安装方法
  8. matlab如何矩阵相除,Matlab中的矩阵除法有问题???
  9. 59.Linux/Unix 系统编程手册(下) -- SOCKET: Internet Domain
  10. canvas视频逐帧播放
  11. 打开相机用鼠标画框,画下一个时上一个消失
  12. java web参考文献_javaweb外文参考文献
  13. 2021-05-19 C语言逻辑取反! 学习
  14. 怎么使用水经注万能地图下载器制作百度个性化地图-人造区域篇
  15. vue.js入门以及和echarts整合之柱状图和中国地图
  16. luci html 页面,luci界面修改
  17. 离散数学模拟微信红包算法升级版
  18. 【织恋袜业】一双袜子的数字化之路——写在第十四届中国·大唐国际袜业博览会开幕前(下)
  19. Mybatis学习笔记(尚硅谷版整理)
  20. SpringCloud之Eureka客户端服务启动报Cannot execute request on any known server解决

热门文章

  1. 拼多多显示服务器有点问题,拼多多为什么登录不上 登录不上解决方法
  2. (整理)吊炸天的CNNs,这是我见过最详尽的图解!(上)
  3. Go 语言的设计反思
  4. 接入支付宝电脑网站支付实现JAVA版
  5. UE4学习笔记-材质篇(一)UV动画制作
  6. 基于准则匹配的图像对准
  7. dell跳过开机硬件检测_戴尔笔记本关闭开机硬件自检
  8. Google Pay India(UPI) 印度
  9. 好嗨呦是谁_抖音好嗨哟原版 《好嗨哟》原唱是谁怎么火起来的
  10. 在HarmonyOS中实现基于JS卡片的音乐播放器