最近应用不定期的会挂得,表现是java堆内存用光,CPU 100%,应用没有响应。用jmap -histo pid(进程号),dump出当前内存java对象信息,
----------------------------------------------
1: 23883422 1383659120 [Ljava.lang.Object;
2: 38566123 1234115936 java.lang.String
3: 38576360 1037800072 [C
4: 31742957 1015774624 com.qidea.gameserver.subsys.battlesys.BattleTapeUnit
5: 10038906 803112480 com.qidea.gameserver.subsys.battlesys.BattleTapeUnitHurt
6: 23865403 572769672 java.util.ArrayList
7: 7935551 444390856 com.qidea.gameserver.subsys.battlesys.BattleTapeUnitFight
8: 11808162 283397352 [F
9: 6605214 211366848 java.util.HashMap$Entry
10: 3122289 149869872 com.qidea.game.map.MapLandTable
11: 66126 94220344 [B
12: 82414 43991784 [Ljava.util.HashMap$Entry;
13: 118473 17773488 <constMethodKlass>
14: 118473 16124280 <methodKlass>
15: 13767 14909176 <constantPoolKlass>
16: 12466 10045840 <constantPoolCacheKlass>
17: 13767 9999456 <instanceKlassKlass>
18: 232564 9155008 [I
19: 159971 9122656 <symbolKlass>
20: 126653 7092568 org.apache.tomcat.util.buf.MessageBytes
21: 147424 7076352 org.apache.tomcat.util.buf.ByteChunk
22: 211044 6753408 java.sql.Timestamp
23: 129619 5184760 org.apache.tomcat.util.buf.CharChunk
24: 7213 4683984 <methodDataKlass>
25: 82978 4646768 org.objectweb.asm.Item
26: 52466 4617008 java.lang.reflect.Method
27: 188251 4518024 org.objectweb.asm.Edge
28: 58425 3739200 org.objectweb.asm.Label
29: 63797 3062256 java.util.HashMap
30: 125571 3013704 java.lang.Long
31: 64031 2561240 java.util.LinkedHashMap$Entry
32: 71741 1853696 [Ljava.lang.String;
33: 44056 1762240 java.lang.ref.SoftReference
34: 108406 1734496 java.lang.Integer
35: 35404 1699392 com.qidea.gameserver.subsys.herosys.RoleBattlearray
36: 14821 1541384 com.qidea.gameserver.subsys.citysys.City
37: 14421 1499784 java.lang.Class
38: 41691 1334112 java.util.Hashtable$Entry
39: 23833 1143984 org.aspectj.weaver.reflect.ShadowMatchImpl
40: 69888 1118208 java.lang.Float
41: 33705 1078560 java.util.concurrent.ConcurrentHashMap$HashEntry
42: 33548 1073536 org.apache.tomcat.util.http.MimeHeaderField
43: 33529 1072928 java.lang.ref.WeakReference
44: 5476 1051392 org.objectweb.asm.MethodWriter
发现BattleTapeUnit,BattleTapeUnitHurt,BattleTapeUnitFight这几个对象比较异常,根据这些类信息,到代码中找出跟这些类相关的代码,排除出了一些问题。修改相关代码后,重新发布应用,跑了一周,内存都很平稳,问题解决。
之前在网上看到过用jmap把堆内存镜象都dump下来,用Eclipse MAT来分析的这种方法来解决内存泄漏问题,我觉得没有必要,首先我应用挂掉后,堆都是满的,这时dump出来的内存镜象少说几百M,大了几个G。我们应用就是8个G,这么大的镜象从正式环境下载下来就比较麻烦,其次用MAT分析,信息太多,没办法一下子抓到重要信息。相比而言使用jmap -histo,来的更简单更快捷一些。
Linux计划任务,自动删除n天前的旧文件
linux是一个很能自动产生文件的系统,日志、邮件、备份等。虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,但需求总是多方面的嘛~我就觉得让系统定时清理一些不需要的文件很有一种爽快的感觉,嘿嘿~~
语句写法:
find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
例1:
find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} \;
将/usr/local/backups目录下所有10天前带"."的文件删除
find:linux的查找命令,用户查找指定条件的文件
/usr/local/backups:想要进行清理的任意目录
-mtime:标准语句写法
+10:查找10天前的文件,这里用数字代表天数,+30表示查找30天前的文件
"*.*":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三
-exec:固定写法
rm -rf:强制删除文件,包括目录
{} \; :固定写法,一对大括号+空格+\+;
若嫌每次手动执行语句太麻烦,可以将这小语句写到一个可执行文件中,再设置cron调度执行,那就可以让系统自动去清理相关文件。
例2:
1.#touch /usr/local/bin/clear
#chmod 777 clear
新建一个可执行文件clear
2.vi clear
编辑clear文件如下:
#!/bin/sh
find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} \;
ok,保存退出
3.#crontab -e
将clear文件加入到系统计划任务,到点自动执行
输入:
* 2 * * * /usr/local/bin/clear
这里的设置是每天凌晨2点执行clear文件进行数据清理,可以研究一下cron,制定自己需要的计划任务
示例:
#!/bin/sh
find /usr/local/jboss-4.2.3.GA/server/default/log -mtime +6 -name "server.log.*" -exec rm -rf {} \;
exit
[root@web3 ~]# crontab -l
* 2 * * * sh /root/AutoDelLog.sh
原文出处:http://blog.chenlb.com/2009/01/install-apache-portable-runtime-or-tomcat-native-on-tomcat.html
apr 与 tomcat-native 提供更好的伸缩性、性能和集成到本地服务器技术。
如果没有apr技术,启动tomcat 时出现如下提示:
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.6.0_06/jre/lib/i386/client:/usr/java/jdk1.6.0_06/jre/lib/i386:/usr/java/jdk1.6.0_06/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
按照官方说明需要:
- APR library
- OpenSSL libraries
openssl 可以用 yum install openssl-devel,apr还是下载*.gz来安装。
apr-1.3.2.tar.gz
apr-util-1.3.2.tar.gz
两个可以在 http://apache.mirror.phpchina.com/apr/ 找到。
tomcat-native.tar.gz 可以在tomcat/bin目录下找到。
安装 apr
- wget http://apache.mirror.phpchina.com/apr/apr-1.3.2.tar.gz
- tar zxvf apr-1.3.2.tar.gz
- cd apr-1.3.2
- ./configure
- make
- make install
apr 默认安装在 /usr/local/apr
安装 apr-util
- wget http://apache.mirror.phpchina.com/apr/apr-util-1.3.2.tar.gz
- tar zxvf apr-util-1.3.2.tar.gz
- cd apr-util-1.3.2
- ./configure --with-apr=/usr/local/apr
- make
- make install
安装 tomcat-native
- cd /usr/local/tomcat-6.0.18/bin
- tar zxvf tomcat-native.tar.gz
- cd tomcat-native-1.1.14-src/jni/native
- ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_11
- make
- make install
设置 apr 的环境变量:
- vi /etc/profile
- # 后面添加以下内容
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
- # 使profile生效,
- source /etc/profile
启动 tomcat 后, 看日志:
- bin/startup.sh
- head logs/catalina.out
可以看到以下结果:
信息: Loaded APR based Apache Tomcat Native library 1.1.14. 2009-1-13 11:12:51 org.apache.catalina.core.AprLifecycleListener init 信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
好了, 可以运行了,但没有测试其性能提交多少。
instanceConnection.client=this;
最近项目在做性能调优,我们的游戏前端是用flex开发的,对于图片的加载方式都是使用动态加载的方式,直接使用flex的image组件,给一个图片的相对路径来引用。在内网测试时没有发现任何问题,之后部署到外网环境,发现前端界面加载很不友好,图片都是一个一个的出来。用户体验不是很好。
为了解决这个问题,我们决定将资源打包成swf,以模块来划分swf。将资源打包成swf有很多种方法,因为对Java熟悉,所以还是选择用Java的来打包资源。于是找出万能的股沟(Google),股沟到一个叫swift-tool的一个开源项目。
Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或者swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。Swfit是一个Java开发的免费工具,因此你需要安装Java虚拟机才能使用它......
具体的相关介绍可以通过这个链接来访问。http://code.google.com/p/swift-tool/

