如何通过"java.lang.String"解决java.lang.OutOfMemoryError错误,由"<system class loader>"Eclipse Memory Analyzer加载

Shi*_*hiv 3 java string memory-leaks heap-memory heap-dump

我正在阅读一些大型XML文件并将它们存储到数据库中.它是800 mb.

它存储了许多记录,然后终止并给出异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.IdentityHashMap.resize(Unknown Source)
    at java.util.IdentityHashMap.put(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

使用Memory Analyzer我创建了.hprof文件,其中说:

  76,581 instances of "java.lang.String", loaded by "<system class loader>" occupy 1,04,34,45,504 (98.76%) bytes. 

Keywords
java.lang.String
Run Code Online (Sandbox Code Playgroud)

我有用于检索值的setter和getter.如何解决此问题.任何帮助都会被贬低.

在此输入图像描述

我通过JRE增加了内存.ini.但问题没有解决

编辑:我使用scireumOpen来读取XML文件.

我使用的示例代码:

public void readD() throws Exception {

        XMLReader reader = new XMLReader();

        reader.addHandler("node", new NodeHandler() {

            @Override
            public void process(StructuredNode node) {
                try {



                    obj.setName(node
                            .queryString("name"));

                    save(obj);

                } catch (XPathExpressionException xPathExpressionException) {
                    xPathExpressionException.printStackTrace();
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        });

        reader.parse(new FileInputStream(
                "C:/Users/some_file.xml"));

    }

    public void save(Reader obj) {

        try {
            EntityTransaction entityTransaction = em.getTransaction();
            entityTransaction.begin();
            Entity e1=new Entity;
            e1.setName(obj.getName());

            em.persist(e1);
            entityTransaction.commit();

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Uwe*_*nus 5

尝试使用另一个解析器进行XML处理.

使用例如800M处理一个大的XML文件DOM是不可行的,因为它占用了很多内存.

尝试在Java中使用SAXot StAX并立即处理解析结果,而不尝试将完整的XML文件加载到内存中.

并且也不要将解析结果保留在内存中.尽可能快地将它们写入数据库并使解析结果的范围尽可能窄.

也许在数据库中使用中间表并对数据库内的所有数据集执行处理部分.