Feeds:
文章
评论

Archive for 2009年六月月

安装方法:
wget http://www.percona.com/mysql/xtrabackup/xtrabackup-0.8.tar.gz
tar zxf xtrabackup-0.8.tar.gz
cd xtrabackup-0.8
./configure
make
make install
使用命令:
sudo ./innobackupex-1.5.1 –user=root –stream=tar backup/ –slave-info –databases=broad | gzip > backup/broad.gz
备注:
innobackupex: You must use -i (–ignore-zeros) option for extraction of the tar stream.

Read Full Post »

为了确定重新部署是否产生内存泄漏(垃圾收集清除不干净,消耗内存越来越多),一个有效的检查方法就是undeploy后,容器为Web Application创建的class loader应该会消失,如果没有的话,那就肯定有内存泄漏了,这时还可以用Profiler工具查看是哪些对象仍然被引用了,比如下图:

容器用的是Jetty,重新部署三次后undeploy,仍然能看到三个WebAppClassLoader对象,每个对象都是因为有org.dom4j.DocumentFactory对象被引用了,引用者就是一个ThreadLocal对象并绑定到了容器创建的一个定时服务线程上(所以不能释放掉)。Dom4J是一个比较好用的XML解析器,估计也是用ThreadLocal来做cache提高性能,搜索一下dom4j memory leak,还真有人报告过这个问题。解决的方法则是升级Dom4J到1.6.1以上,新版本已经解决了这个问题。。。
下面的图是解决内存泄漏后的一次重新部署,可以清楚看到垃圾收集启动了一次,清除干净了内存,WebAppClassLoader对象还是只有一个。

常见的造成内存泄漏的原因:
JDBC Driver Manager
在全局的DriverManager注册了 driver后不注销掉会引起内存泄漏,解决方法是在ServletContextListener的contextDestroyed()方法内使用下列代码:

try {
Enumeration drivers = DriverManager.getDrivers();
while(drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
if (driver.getClass().getClassLoader() == getClass().getClassLoader()) {
[...]

Read Full Post »

开发时候为了提高效率,我们总希望重新编译的类能立刻生效,或重新部署应用而不重新启动应用服务器—所谓的”热部署“
无论是用Resin, Tomcat,Jetty, 如果你试图不重新启动应用服务器,而重新部署你的应用(WebApp),多来几次后就可能会出现:”java.lang.OutOfMemoryError: PermGen space”的错误。
PermGen 是JVM用来保存类定义和常量池的保留空间,缺省是64M,虽然你可以通过 -XX:MaxPermSize启动参数来增加PermGen空间,但这也只是允许你多reload几次,而不能根本解决问题。
问题主要原因是出在Class loader上,Tomcat是按下面的关系来创建Webapp的Class Loader(详见:http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html)
Bootstrap
|
System
|
Common
[...]

Read Full Post »