代码之家  ›  专栏  ›  技术社区  ›  Xearox

JSON生成器导致Tomcat8应用程序内存泄漏

  •  0
  • Xearox  · 技术社区  · 7 年前

    我已经为Tomcat8服务器创建了一个WebApp。这是一个基于网络的小游戏。

    自从我从flatfiles切换到MySQL之后,javax出现了很多问题。json生成器。

    这里是我的代码部分:

    public void saveUserResearch(){
        MySQLTable t = SpaceWar.instance().getUserResearchTable();
    
        JsonObjectBuilder mainBuilder = Json.createObjectBuilder();
        JsonObjectBuilder subBuilder = Json.createObjectBuilder();
        for(UserResearch r : getResearchList()){
            int index = r.getIndex();
            subBuilder = Json.createObjectBuilder();
            subBuilder.add("index", r.getIndex());
            subBuilder.add("level", r.getLevel());
            subBuilder.add("planed_level", r.getPlanedLevel());
            subBuilder.add("player_uuid", r.getPlayerUUIDAsString());
            subBuilder.add("unlocked", r.getUnlocked());
            subBuilder.add("savedInPlayer", "yes");
            mainBuilder.add(index+"", subBuilder.build());
        }
        String q = "";
        q += "user_uuid:" + getUUID().toString() + ";";
        q += "research_json:" + mainBuilder.build();
        t.insertUpdate(q).sync();
    
    }
    

    <!-- https://mvnrepository.com/artifact/javax.json/javax.json-api -->
            <dependency>
                <groupId>javax.json</groupId>
                <artifactId>javax.json-api</artifactId>
                <version>1.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.glassfish/javax.json -->
            <dependency>
                <groupId>org.glassfish</groupId>
                <artifactId>javax.json</artifactId>
                <version>1.0.4</version>
            </dependency>
    

    这个方法我每2分钟从一个线程调用一次。我在游戏中有15个用户,所以它运行了15次。它创建了一个JSON对象和我保存到MySQL数据库的JSON对象。所以我预计会有15个例子。

    问题是几个小时后,Tomcat服务器崩溃,并显示以下消息。

    Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000007b5400000, 1048576, 0) failed; error='Cannot allocate memory' (errno=12)
    
     There is insufficient memory for the Java Runtime Environment to continue.
     Native memory allocation (mmap) failed to map 1048576 bytes for committing reserved memory.
     An error report file with more information is saved as:
     /tmp/hs_err_pid11069.log
    

    enter image description here enter image description here

    在第一个图像中,您可以看到相同的用户json对象。

    2小时后看起来像这样

    enter image description here enter image description here

    大约5个小时后,它的内存就用完了

    enter image description here

    我不知道为什么生成器会导致这种内存泄漏,我的知识还不足以解决它。也许你能帮我。

    我将非常感激。非常感谢你。

    SpiderMySQL 还有javax。json。Json;javax。json。JSONObject Builder;

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sorontur    7 年前

    我想我找到了问题所在。这是mysql库! 看看这里的课堂: https://gitlab.com/Syranda/SpiderMySQL/blob/development/src/main/java/de/syranda/spidermysql/WatchThread.java

    它不是线程安全的,因为ArrayList不是线程安全的。他们已经收到了这方面的错误通知单。

    结合本课程: https://gitlab.com/Syranda/SpiderMySQL/blob/development/src/main/java/de/syranda/spidermysql/table/InsertQuery.java

    它让 constructor中的引用转义。这在多线程环境中是非常有害的。它会产生奇怪的行为,可能会导致内存泄漏。

    在这种情况下,您可以尝试切换到纯jdbc,以测试内存泄漏是否仍然存在。我建议使用任何其他lib,它似乎没有得到很好的实现。

    无内存泄漏