java非堆内存溢出求教
问题描述:1、由于通过反射机制调用大量jar,造成非堆内存溢出。
2、本系统是一个实时监控系统,采用多线程设计,每间隔一定时间(比如1分钟)执行一次监控任务。
3、由于考虑了系统的灵活性,设计了一个主调jar和一系列的被调jar。被调用jar可以动态地添加和移除
,每个被调用jar执行一个具体的监控任务。主调jar采用多线程,一直以一定时间间隔调用被调jar。主要的被调用jar有:
监控cpu的jar,监控memory的jar,监控disk的jar,监控网络的jar,监控ftp的jar,监控os的jar,监控tomcat的jar,监控database的jar。
4、测试中发现java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出
5、用jsoncole和jprofiler分析,每执行一次监控任务,调用一系列jar之后会增加数百个类,非堆内存会增加2-3M。最后
造成非堆内存不足而出现溢出。
6、查阅网上大量资料,说反射中生成的实例是放在非堆内存中。这块内存在程序运行期间是不会被gc回收的,无论是否显示调用gc。
7、主要出现问题的jar是执行数据库监控任务的jar。这个jar使用jdbc访问db2 9.7数据库,获取数据返回给主调的jar。单独测试数据库
监控任务的jar,没有明显问题,执行很长时间非堆内存有少量增加。主调jar与其它全部被调jar结合,除数据库监控的jar,没有明显问题。
二者结合出现上述问题。
8、代码审查,把string型的变量已经减少到最少,静态变量减少到最少,不用的对象及时显示设置为null,集合类变量也及时设置为null,
还显示调用了System.gc(),及Runtime.getRuntime.gc()。均不能解决问题。
需要解决的问题:
1、是否有办法释放非堆内存?
2、如果不能释放非堆内存,是否可以采用其它好的办法完成这个监控任务。
(重点:第一,监控必须持续不断的运行,第二,监控项要做到自由灵活的加入和移除,不能把所有逻辑全写到一个jar中)
谢谢高手指教。
联系QQ:308630267 --------------------编程问答-------------------- 第六条 扯淡 --------------------编程问答-------------------- 会不停的有class被load进来么 --------------------编程问答-------------------- 什么叫反射机制调用大量JAR...
反射是调用class的,并且,能被反射,说明这些类已经被加载了
jar是在classload加载的,难道你还用多线程进行classload了??
tomcat jboss的classload算是很牛的自定义classload了,但是也做不到你这么个玩法吧
补充:Java , Java SE