不停的实例化对象导致OOM

使用axis调用webService,系统运行一段时间后,出现了 OOM,还好日志中 记下了错误信息。

Exception in thread "Thread-1301" java.lang.OutOfMemoryError: Java heap space
	at org.apache.xerces.dom.DeferredDocumentImpl.createChunk(Unknown Source)
	at org.apache.xerces.dom.DeferredDocumentImpl.ensureCapacity(Unknown Source)
	at org.apache.xerces.dom.DeferredDocumentImpl.createNode(Unknown Source)
	at org.apache.xerces.dom.DeferredDocumentImpl.createDeferredDocument(Unknown Source)
	at org.apache.xerces.parsers.AbstractDOMParser.startDocument(Unknown Source)
	at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
	at org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369)
	at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388)
	at org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)
	at org.apache.axis.AxisEngine.init(AxisEngine.java:172)
	at org.apache.axis.AxisEngine.<init>(AxisEngine.java:156)
	at org.apache.axis.client.AxisClient.<init>(AxisClient.java:52)
	at org.apache.axis.client.Service.getAxisClient(Service.java:104)
	at org.apache.axis.client.Service.<init>(Service.java:113)
	at catic.hotel.server.webservice.PmsServiceData.<init>(PmsServiceData.java:26)
	at catic.hotel.server.task.SendCmdTask.<init>(SendCmdTask.java:200)
	at catic.hotel.server.task.TaskFactory.getTask(TaskFactory.java:155)
	at catic.hotel.server.server.ReadData.read(ReadData.java:82)
	at catic.hotel.server.server.ReadData.run(ReadData.java:57)

  由于系统会频繁的进入到 SendCmdTask,而我又在此构造方法中不停的new PmsServiceData(),而PmsService的无参构造方法中又new Service(),相当于导致了Service对象不停的被实例化,时间久了,则出现OOM。

解决方法:

  对PmsServiceData使用单例模式,即:

    private static PmsServiceData pmsServiceData = null;

    // 单例
    public static synchronized PmsServiceData getInstance(){
        if(null == pmsServiceData){
            pmsServiceData = new PmsServiceData();
        }
        return pmsServiceData;
    }

问题解决。

时间: 2024-11-08 21:08:21

不停的实例化对象导致OOM的相关文章

Android开发中解析、创建Bitmap对象时OOM的有效解决方法并附上一些干货

先来点鸡汤: Stay hungry,stay foolish 这句话的的解读:我们必须了解自己的渺小.如果我们不学习,科技发展的速度会让我们五年后被清空.所以,我们必须用初学者谦虚的自觉,饥饿者渴望的求知态度,来拥抱未来的知识. 这几天做的项目中需要从图库选择图片或者拍照生成图片,然后展现在IamgeView控件上.当然,从图库选择图片和拍照选择图片的功能实现起来很简单.直接写上代码: CharSequence[] items = { "拍照", "图库" };

抽象类不能实例化对象

抽象类无法实例化,无法创建对象.现实生活中也有抽象类的类子,比如说人类是一个抽象类,无法创建一个叫人类的对象,人继承人类来创建对象.况且抽象类中的抽象方法只有声明,没有主体,如果实例化了,又如何去实现调用呢? sleep和wait的区别有: 1,这两个方法来自不同的类分别是Thread和Object 2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法. 3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而s

C++只在栈或堆上实例化对象

C++如何让类对象只能在堆(栈)上分配空间 一般情况下写一个类都是可以采用new在堆上分配空间,或直接采用 类名+对象名 的方式在栈上分配空间.但有时候,如果想让一个类只能在栈上或者堆上分配空间,又该怎么实现呢? 下面分别来介绍如何定义只能在栈上或堆上实例化的类. 注:1.静态实例化对象 如 A a;的步骤为:先由编译器为对象在栈空间分配内存,移动栈顶指针,挪出适当的空间,然后在这个空间上调用构造函数形成一个对象,在对象使用完之后,调用析构函数回收内存,栈顶指针减一.2.动态实例化对象:new操

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java反射-反射实例化对象-反射获得构造方法-反射获得普通方法-获得属性

链接:https://www.zhihu.com/question/24304289/answer/38218810来源:知乎著作权归作者所有,转载请联系作者获得授权. Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象 第一步:获得对象,构造方法,普通方法,属性 Object obj = cls.newInstance() Constructor<?> cons = cls.get

c++中实例化对象的大小(转)

今天随手写了一个类,用sizeof()测试实例化类对象的大小时遇到了一些问题. 一般来说,对象大小由数据成员大小决定,不包含成员函数的大小. 在网上找了一篇很详细的例子,我遇到的问题为实例三情形,涉及到编译器的优化. 之所以写这篇<C++类的实例化对象的大小之sizeof()>,是因为在参加笔试的时候遇到如下这么一道题,当时感觉就是这个一个坑,但,我还是义无反顾的跳了下去,因为存在知识点盲区啊.现,总结一下,你不知道的C++类的实例化对象的大小之sizeof(). class D{public

[转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如果实例化的是一个空模型 例如 $Demo = new Model(); 那么它等价于

ThinkPHP中实例化对象M()和D()的区别,select和find的区别

原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如

【PHP面向对象(OOP)编程入门教程】5.如何实例化对象?

我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了. 当定义好类后,我们使用new关键字来生成一个对象. $对象名称 = new 类名称(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php class Person {     // 下面是人的成员属性     var $name; // 人的名字     var $sex; // 人的性别     var $