以后请发到java论坛中基于WebSphere 构建的企业应用,时常会出现性能问题,在严重的情况下还会提示出内存溢出,这是一件很让人恼怒的事情。在WebSphere Application Server(Was)运行的时候,内存溢出,会生成大量的溢出文件,如Javacore, Heapdump等文件,占用了大量的磁盘空间。在这种情况下,时常会出现一连串的系统问题,如部署在Was的所有应用服务都报错,Was连控制台也无法访问等。  为解决问题,我们通常会选择重新启动整个Was或者服务器,然后分析运行日志SystemOut.log、ystemErr.log、ative_stdout.log、native_stderr.log 和系统内存溢出的时候产生的Javacore、Heapdump文件来寻找出问题。  那么,为什么会出现内存溢出呢?  应用服务器在运行过程中需要创建很多对象,而在应用服务器的堆空间大小有限的情况下,请求进程不断申请空间来创建与存放对象,在达到上限时而服务器又没能释放出空间来处理申请空间的请求就会出现内存溢出情况。这就像吹气球,当气球中的气体到达一定程度时,气球就会被撑爆。(32位的JDK的Jvm堆空间分配最大支持1.5G的大小,超过则无法正常启动。而64位的JDK堆大小分配无限制,其大小受到服务器的内存限制。)通常在投入生产的系统中,出现溢出一般都是对象分配不合理导致的。 在此,让我们先了解下Java世界里,对象与对象管理是怎么一回事。  在Java的体系中,所有的类作为一个对象(包括Jdk本身提供的类,应用中由开发人员编写的类),都是直接或者间接继承了Java.lang.object产生的。这些类被创建的时候都会向Jvm堆申请一定的内存空间存放,因此在Jvm堆空间里会存放各式各样的对象,有的是静态类型,有的是私有类型等等,而这些对象都是通过垃圾收集器进行管理的。  垃圾收集器(Garbage Collection,我们通常称之为GC),它是Java与C++语言的一个显著的不同点。Java语言通过垃圾收集器管理内存中的对象,垃圾收集器是在C++基础上的一种极大进步,使许多编程问题消失于无形中。通过垃圾回收,在Java编程过程中,内存漏洞的情况会少得多。  虽然垃圾收集器为开发带来了极大的便利,但如果对象分配与使用不合理,也会导致垃圾回收在性能上拖Jvm的后腿。为了解决性能问题,GC则是一个让我们不能忽视的问题。根据不同的应用场景,选择适合的GC策略,可以帮助系统性能在一定程度上得到显著的优化。  垃圾收集器为了快速清除在JVM堆中不再使用的对象,从而释放出空间来供其他请求创建对象,常见的方法有引用计数方法和对象引用遍历方法等算法,目前主流的方法为对象引用遍历方法。通过这些高效的算法实现的GC策略有许多种,他们都是针对各种应用场景而产生的,我们可以通过在JVM启动参数中设置,来调整GC策略。