如何在java中处理海量数据
现在,我需要将数据库中的大量数据加载到向量中,但当我加载38000行数据时,程序抛出OutOfMemoryError异常。 我能做些什么来处理这件事如何在java中处理海量数据,java,database,Java,Database,现在,我需要将数据库中的大量数据加载到向量中,但当我加载38000行数据时,程序抛出OutOfMemoryError异常。 我能做些什么来处理这件事 我想我的程序可能有内存泄漏,检测它的好方法?谢谢让你的程序使用更多内存或者更好地重新考虑策略。你真的需要在内存中存储这么多数据吗?让你的程序使用更多内存,或者更好地重新思考策略。内存中真的需要这么多数据吗?您可以尝试增加堆大小: java -Xms<initial heap size> -Xmx<maximum heap siz
我想我的程序可能有内存泄漏,检测它的好方法?谢谢让你的程序使用更多内存或者更好地重新考虑策略。你真的需要在内存中存储这么多数据吗?让你的程序使用更多内存,或者更好地重新思考策略。内存中真的需要这么多数据吗?您可以尝试增加堆大小:
java -Xms<initial heap size> -Xmx<maximum heap size>
您可以尝试增加堆大小:
java -Xms<initial heap size> -Xmx<maximum heap size>
为JVM提供更多内存(通常使用
-Xmx
/-Xms
),或者不要将所有数据加载到内存中
对于大量数据的许多操作,有一些算法不需要一次访问所有数据。其中一类算法是。为JVM提供更多内存(通常使用
-Xmx
/-Xms
),或者不将所有数据加载到内存中
对于大量数据的许多操作,有一些算法不需要一次访问所有数据。其中一类算法是。您真的需要在内存中存储这么大的对象吗
根据您对该数据的处理方式,您可能希望将其拆分为较小的数据块。您真的需要将如此大的对象存储在内存中吗
根据您对该数据的处理方式,您可能希望将其拆分为较小的数据块。逐节加载数据。这不会让您同时处理所有数据,但您不必更改提供给JVM的内存。逐节加载数据。这不会让您同时处理所有数据,但您不必更改提供给JVM的内存。是否可以优化您的数据类?我见过一个案例,有人在内存中存储相对较少的数据对象时,使用字符串代替本机数据类型,例如int或double,用于每个类成员,该类成员都会出现OutOfMemory错误。请注意,您没有复制对象。当然,还要增加堆的大小:
java -Xms<initial heap size> -Xmx<maximum heap size>
java-Xmx512M(或您认为必要的任何东西)是否可以优化您的数据类?我见过一个案例,有人在内存中存储相对较少的数据对象时,使用字符串代替本机数据类型,例如int或double,用于每个类成员,该类成员都会出现OutOfMemory错误。请注意,您没有复制对象。当然,还要增加堆的大小:
java -Xms<initial heap size> -Xmx<maximum heap size>
java-Xmx512M(或任何您认为必要的东西)如果必须将所有数据都存储在内存中,请尝试缓存常见的对象。例如,如果您正在查看员工记录,并且这些记录都有一个职务,则在加载数据时使用HashMap并重用已找到的职务。这可以显著降低您使用的内存量
此外,在您做任何事情之前,请使用探查器查看内存在哪里被浪费,并检查可以被垃圾收集的东西是否没有浮动的引用。同样,String是一个常见的例子,因为例如,如果您使用2000字符字符串的前10个字符,并且您使用子字符串而不是分配新字符串,那么您实际拥有的是对char[2000]数组的引用,两个索引分别指向0和10。这也是一个巨大的内存浪费。如果必须将所有数据都存储在内存中,请尝试缓存常见的对象。例如,如果您正在查看员工记录,并且这些记录都有一个职务,则在加载数据时使用HashMap并重用已找到的职务。这可以显著降低您使用的内存量
此外,在您做任何事情之前,请使用探查器查看内存在哪里被浪费,并检查可以被垃圾收集的东西是否没有浮动的引用。同样,String是一个常见的例子,因为例如,如果您使用2000字符字符串的前10个字符,并且您使用子字符串而不是分配新字符串,那么您实际拥有的是对char[2000]数组的引用,两个索引分别指向0和10。同样,这也是一个巨大的内存浪费。您可以使用探查器运行代码,以了解内存被占用的方式和原因。调试循环并观察实例化的内容。它们的数量不限;JProfiler,请参阅,等等。您可以使用探查器运行代码,以了解内存被占用的方式和原因。调试循环并观察实例化的内容。它们的数量不限;JProfiler,请参阅,等等。我知道您正在尝试将数据读入向量-否则,如果您尝试在何处显示它们,我会建议您使用。它是为将大量数据读入表而设计的
我相信它对这里的其他读者可能有用。我知道您正在尝试将数据读入矢量-否则,如果您尝试在何处显示它们,我会建议您使用。它是为将大量数据读入表而设计的
我相信它可能对这里的其他读者有用。使用内存映射文件。内存映射文件基本上可以按您的需要增长,而不会撞到堆。它确实要求您以解码友好的方式对数据进行编码。(比如,为数据中的每一行保留一个固定的大小是有意义的,以便快速跳过许多行。)
这让你很容易处理。它是一个框架,旨在像Hibernate对关系数据库和JAXB/XStream/XmlBeans对XML所做的那样对二进制编码数据进行处理。使用内存映射文件。内存映射文件基本上可以按您的需要增长,而不会撞到堆。它确实要求您以解码友好的方式对数据进行编码。(比如,保留一个fi是有意义的