摘要: 最近应用不定期的会挂得,表现是java堆内存用光,CPU 100%,应用没有响应。用jmap -histo pid(进程号),dump出当前内存java对象信息,num #instances #bytes class name---------------------------------------------- 1: 23883422 1383659120 [Ljava.lang.Object; 2: 38566123 1234115936 java.lang.String 3: 38576360 1037800072 [C 4: 31742957 1015774624 com.qi..阅读全文
posted @ 2012-01-21 11:20 摇摆的蒜头酥 阅读(54) 评论(0) 编辑
摘要: 最近项目在做性能调优,我们的游戏前端是用flex开发的,对于图片的加载方式都是使用动态加载的方式,直接使用flex的image组件,给一个图片的相对路径来引用。在内网测试时没有发现任何问题,之后部署到外网环境,发现前端界面加载很不友好,图片都是一个一个的出来。用户体验不是很好。 为了解决这个问题,我们决定将资源打包成swf,以模块来划分swf。将资源打包成swf有很多种方法,因为对Java熟悉,所以还是选择用Java的来打包资源。于是找出万能的股沟(Google),股沟到一个叫swift-tool的一个开源项目。 Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(.阅读全文
posted @ 2011-03-31 14:48 摇摆的蒜头酥 阅读(402) 评论(0) 编辑

       最近应用不定期的会挂得,表现是java堆内存用光,CPU 100%,应用没有响应。用jmap -histo pid(进程号),dump出当前内存java对象信息,

 

 num     #instances         #bytes  class name
----------------------------------------------
   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
  45:         ...............................................................

 

      发现BattleTapeUnit,BattleTapeUnitHurt,BattleTapeUnitFight这几个对象比较异常,根据这些类信息,到代码中找出跟这些类相关的代码,排除出了一些问题。修改相关代码后,重新发布应用,跑了一周,内存都很平稳,问题解决。

      之前在网上看到过用jmap把堆内存镜象都dump下来,用Eclipse MAT来分析的这种方法来解决内存泄漏问题,我觉得没有必要,首先我应用挂掉后,堆都是满的,这时dump出来的内存镜象少说几百M,大了几个G。我们应用就是8个G,这么大的镜象从正式环境下载下来就比较麻烦,其次用MAT分析,信息太多,没办法一下子抓到重要信息。相比而言使用jmap -histo,来的更简单更快捷一些。

posted @ 2012-01-21 11:20 摇摆的蒜头酥 阅读(54) 评论(0) 编辑

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

posted @ 2011-12-30 14:55 摇摆的蒜头酥 阅读(47) 评论(0) 编辑

原文出处: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

  1. wget http://apache.mirror.phpchina.com/apr/apr-1.3.2.tar.gz  
  2. tar zxvf apr-1.3.2.tar.gz  
  3. cd apr-1.3.2  
  4. ./configure  
  5. make  
  6. make install  

apr 默认安装在 /usr/local/apr

安装 apr-util

  1. wget http://apache.mirror.phpchina.com/apr/apr-util-1.3.2.tar.gz  
  2. tar zxvf apr-util-1.3.2.tar.gz  
  3. cd apr-util-1.3.2  
  4. ./configure --with-apr=/usr/local/apr  
  5. make  
  6. make install  

安装 tomcat-native

  1. cd /usr/local/tomcat-6.0.18/bin  
  2. tar zxvf tomcat-native.tar.gz  
  3. cd tomcat-native-1.1.14-src/jni/native  
  4. ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_11  
  5. make  
  6. make install  

设置 apr 的环境变量:

  1. vi /etc/profile  
  2. # 后面添加以下内容  
  3. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib  
  4. # 使profile生效,  
  5. source /etc/profile  

启动 tomcat 后, 看日志:

  1. bin/startup.sh  
  2. 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].

好了, 可以运行了,但没有测试其性能提交多少。

posted @ 2011-12-16 12:06 摇摆的蒜头酥 阅读(47) 评论(0) 编辑
因为现在游戏的登录控制是通过cookie来做的,这样就会导致同一个用户的状态在多个客户端不一致。为了防止这个问题就必须禁止用户双开,在加载程序上附上这段代码就可以了
var instanceConnection :LocalConnection = new LocalConnection( );
var isRun:Boolean = false;
try
{

   instanceConnection.client=this;

   instanceConnection.connect( "double_run" );
}
catch (e:Error)
{
   isRun = true;
}
if (isRun)
{
   trace("double run");
}
else
{
   trace("ok");
}
posted @ 2011-07-26 11:35 摇摆的蒜头酥 阅读(145) 评论(0) 编辑

最近项目在做性能调优,我们的游戏前端是用flex开发的,对于图片的加载方式都是使用动态加载的方式,直接使用flex的image组件,给一个图片的相对路径来引用。在内网测试时没有发现任何问题,之后部署到外网环境,发现前端界面加载很不友好,图片都是一个一个的出来。用户体验不是很好。

为了解决这个问题,我们决定将资源打包成swf,以模块来划分swf。将资源打包成swf有很多种方法,因为对Java熟悉,所以还是选择用Java的来打包资源。于是找出万能的股沟(Google),股沟到一个叫swift-tool的一个开源项目。

Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或者swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。Swfit是一个Java开发的免费工具,因此你需要安装Java虚拟机才能使用它......

具体的相关介绍可以通过这个链接来访问。http://code.google.com/p/swift-tool/ 

posted @ 2011-03-31 14:48 摇摆的蒜头酥 阅读(402) 评论(0) 编辑
摘要: 提到通信就得面临两个问题,一是通信协议的选择,二是数据协议的定义。通信协议耳熟能详的就有好几种,TCP,UDP,HTTP,FTP等等。数据协议是一种数据交换的格式,像jason,xml,amf3,google protocol都可以用作数据协议,你也可以自己根据通信的效率,安全等因素来定义自己的数据协议。  通信系统的开发是一项很复杂的工作,不要以为往发服务端发一个Hello World!就认为完...阅读全文
posted @ 2010-09-06 17:07 摇摆的蒜头酥 阅读(4451) 评论(23) 编辑
摘要: 简介Thrift是Facebook的核心框架之一,使不同的开发语言开发的系统可以通过该框架实现彼此的通信,类似于webservice,但是Thrift提供了近乎变态的效率和开发的方便性,是webservice所不能比拟的。给分布式开发带来了极大的方便。但是这柄利器也有一些不完美。 问题首先文档相当的少,只有一个wiki网站提供相应的帮助。这对于Thrift的推广极为不利。其次框架本身实现有一些缺陷...阅读全文
posted @ 2010-08-18 10:21 摇摆的蒜头酥 阅读(1614) 评论(0) 编辑
摘要: thrift 安装 m4_pattern_allow ltmain.sh' not found 阅读全文
posted @ 2010-08-06 11:36 摇摆的蒜头酥 阅读(971) 评论(0) 编辑
摘要: 最近要架设一个网页游戏,就到硬件市场配了一台服务器,下面是具体的配置清单:    Intel Xeon 5310 1.6G 1350  金士顿4GB DDR2 667(ECC FB DIMM)*2 全缓冲处理内存 680*2  主板 Intel S5000VSA 1750  硬盘 320G SATA*2 450*2   国鑫GX514 660   电源 海韵SS-520H2U阅读全文
posted @ 2010-07-09 12:26 摇摆的蒜头酥 阅读(320) 评论(0) 编辑
摘要: 最近做完一个项目的Demo版本,将应用程序deploy到服务器上。运行一段时间后,把相关的日志从服务器load下来,发现异常堆栈信息里,没有相应的代码行号。只显示Unknown source.这对我们定位问题相当麻烦。  应用程序是用ant编译的,于是股沟了一下,发是用ant编译Java程序与javac编译是有些差别的。当通过javac编译时,默认相当于指定-g:source,lines,这样编译...阅读全文
posted @ 2010-06-29 15:02 摇摆的蒜头酥 阅读(554) 评论(0) 编辑