月度存档: 二月 2014

查找服务器一个内存溢出的bug

最近两天晚上以每分钟一次的频率进行热更新,测试这种压力程度是否会引起bug。

早上到公司一看服务器已经死掉了,提示outofmemory,看来应该是有一个内存举出的地方。

服务器直接挂掉,连dump内存都无法成功。

使用jprofiler观察内存中的对象时时变化。

jprofiler中发现classloader没有被释放掉?

google之:

http://zeroturnaround.com/rebellabs/rjc201/

http://frankkieviet.blogspot.com/2006/10/how-to-fix-dreaded-permgen-space.html

http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory-analyser-mat/

得知:classloader中会引用所加载类中的静态属性,从而导致classloader内存泄露。

将内存dump出来后,使用clipse Memory Analyser (MAT),查看具体哪里泄露。

直接在eclipse 中查找memory analyser 出来好多个软件。

mat 的update site:http://download.eclipse.org/mat/1.3.1/update-site/

其它的memory analyser软件,有时间再去了解下。

 

学习小记

今天跑通了ejoy2d。

了解到了mingw的功能,真是c/c++开发必备利器。基本上无缝移植至linux系统。

了解到了glew,跨平台的opengl开发工具包。不过好像只支持windows,linux,ios,android的支持未发现。

下载了powervr sdk,看起来powervr sdk支持所有平台,需要试一下。

另外需要学习luabinding。

 

 

eclipse-c 在windows平台下编译lua

最近几天有点空闲,想重拾c及lua。

目前c及lua的开发方式还是很火的一种方式,也是非常便捷。

云风使用c+lua做的服务器skynet及游戏引擎enjoy2d。

我也准备以上面两个开源项目来学习。

因能力所限,还只能借助于ide来进行开发学习。

下载eclipse-c

下载mingw,这个东西用起来感觉比cygwin方便。

在preferences->c/c++->build->enviroment设置环境变量。

这里我设置了PATH MINGW_HOME C_INCULUDE_PATH CPLUS_INCLUDE_PATH 4个环境变量

然后在lua工程中properties -> c/c++ general -> paths and symbos。

将C_INCLUDE_PATH 及 CPLUS_INCLUDE_PATH 添加至GNU C。

OK,可以正常的编译lua,也不报“Unresolved inclusion”错误。

编译云风大神的ejoy2d,成功后无法运行,直接程序就死掉,没有任何提示信息,偶然见到有个人提到驱动更新,把自己的显卡驱动更新为最新,顺利解决掉问题。

 

判断一个类为虚拟类

Modifier.isAbstract(clazz.getModifiers())

以上方式用来判断是clazz是否为虚拟类。

classloader重新加载资源

app在tomcat中运行,默认使用的是WebappClassLoader。

InputStream inputStream =Thread.currentThread().getContextClassLoader().getResourceAsStream(“xls/” +
xlsName);

inputStream只要加载过一次后,就会被WebappClassLoader缓存起来,如果需要加载新的资源文件,需要修改为以下方式:

// 因为webappclassloader会缓存加载的资源,所以每次手动去打开文件
			// InputStream inputStream =
			// GameInstance.gameClassLoader.getResourceAsStream("xls/" +
			// xlsName);
			URL xlsURL = GameInstance.gameClassLoader.getResource("xls/" + xlsName);
			URLConnection resConn = xlsURL.openConnection();
			resConn.setUseCaches(false);
			InputStream inputStream = resConn.getInputStream();

freemark关闭日志

改为logback后就发现freemark疯狂的输出log。

Logger.selectLoggerLibrary(Logger.LIBRARY_NONE);