使用最大资源运行 jar 命令行



我正在尝试运行一个适用于 100M 行记录的 jar。我达到了 GC 超限。它适用于 10M,没有问题。

我知道最好的办法是找到溢出发生的位置

我想尝试一次在服务器上运行 jar,使其在堆内存、GC 内存等方面获得最大资源。

我尝试使用 -xms 和 -xmc 运行我的罐

子java -Xmx256m -Xmc256m -jar myapp.jar//类似的东西

我想知道如何以最大可能的资源运行,因为我不将此服务器用于任何其他应用程序。

我也尝试使用此命令进行多线程

java -jar -Xmx30024m -XX:ParallelGCThreads=12000 myapp.jar

但我不确定这会有多大作用。

有人可以建议我如何通过在命令行进行一些有限的更改来克服此 GC 错误以使用实例中的最大资源。

问题不在于垃圾收集器,GC 速度很快。GC 只会在您已经没有剩余内存时抛出此错误。30GB 绝对足以容纳 100M 条记录,除非记录很大。每条记录的大小是多少?我会尝试:

1(确保你有64位Java,如果你不小心使用了32位Java,请重新运行你的代码

2(将对象从最内层循环中拉出/优化对象分配,即:使用.clear((;不要创建新数组。将一个最内层的循环拆分为几个不同的循环,每次迭代需要分配的对象数量更少。

3(尝试使您的工作成为增量,即使用合并排序而不是快速排序。这样,您可以在 10M 记录输入的多个实例之间拆分工作,并在合并到 100M 答案之前保存每个增量进度。

4( 用 C/C++/Rust 编写代码,因此它使用堆栈而不是堆作为临时变量。如果你在 Java 版本的最内层循环中的任何位置都没有使用"new",那么你可能需要更多地压缩数据使用量。对 5M、10M、15M 记录的内存使用情况进行基准测试,以获得每条记录的每字节影响(穿过这三个点的线的斜率(,看看您是否可以想象如果您可以用系统语言单独控制每个字节,则能够以更少的字节保存每条记录(并查看该值是否仍然小于您拥有的 RAM

(。5(如果你的记录很大(>1kb(,你肯定想做一个缓存。使用 getter 访问每条记录,而不是直接从数组访问,并限制内存使用量。让 getter 访问一个简单的 100M 引用数组,并将自己限制为其中 90M 为 NULL。如果在已使用 10M 时尝试访问新记录,则在访问磁盘之前将随机/很少使用的现有记录设置为 NULL,缓存该值并返回请求的记录。确保您的算法很好地适应此缓存(比建议 #3 的要求更宽松,但原则上相同(。

最新更新