Java,如何决定为Java应用程序设置合适的TLABSIZE

问题描述 投票:1回答:1

使用Java 14的单个cpu arm7(32位)设备上的Java应用程序偶尔会崩溃在负载下运行了几个小时之后,并且在ThreadLocalAllocBuffer::resize()中始终失败

--------------- T H R E A D ---------------

Current thread (0xb6582a30): VMThread "VM Thread" [stack: 0x7b716000,0x7b796000] [id=3625] _threads_hazard_ptr=0x7742f140

Stack: [0x7b716000,0x7b796000], sp=0x7b7946b0, free space=505k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x48015e] ThreadLocalAllocBuffer::resize()+0x85

[error occurred during error reporting (printing native stack), id 0xb, SIGSEGV (0xb) at pc=0xb6b4ccae]

现在这肯定是JVM中的错误,但是由于它不是标准Java平台之一,而且我没有简单的测试用例,因此我看不到它很快就会得到修复,因此我正在尝试解决该问题。还值得注意的是,当我使用Java 11时,它与ThreadLocalAllocBuffer :: accumulate_statistics_before_gc()

崩溃,这就是为什么我转向Java 14尝试解决问题的原因。

由于TLAB的问题是,一种解决方案是用-XX:-UseTLAB禁用TLABS,但这会使代码在已经很慢的机器上运行得更慢。

所以我认为另一种解决方案是禁用-XX:-ResizeTLAB的大小调整,但是随后我需要知道计算出合适的大小并使用-XX:TLABSize=N指定该大小。但是我不确定N

实际代表什么以及要设置的合适大小

我尝试将-XX:TLABSize=1000000设置为我觉得很大吗?

我有一些设置为]的日志记录>

 -Xlog:tlab*=debug,tlab*=trace:file=gc.log:time:filecount=7,filesize=8M

但是我不太了解输出。

[2020-05-19T15:43:43.836+0100] ThreadLocalAllocBuffer::compute_size(132) returns 250132
[2020-05-19T15:43:43.837+0100] TLAB: fill thread: 0x0026d548 [id: 871] desired_size: 976KB slow allocs: 0  refill waste: 15624B alloc: 0.25725     1606KB refills: 1 waste  0.0% gc: 0B slow: 0B fast: 0B
[2020-05-19T15:43:43.853+0100] ThreadLocalAllocBuffer::compute_size(6) returns 250006
[2020-05-19T15:43:43.854+0100] TLAB: fill thread: 0xb669be48 [id: 32635] desired_size: 976KB slow allocs: 0  refill waste: 15624B alloc: 0.00002        0KB refills: 1 waste  0.0% gc: 0B slow: 0B fast: 0B
[2020-05-19T15:43:43.910+0100] ThreadLocalAllocBuffer::compute_size(4) returns 250004
[2020-05-19T15:43:43.911+0100] TLAB: fill thread: 0x76c1d6f8 [id: 917] desired_size: 976KB slow allocs: 0  refill waste: 15624B alloc: 0.91261     8085KB refills: 1 waste  0.0% gc: 0B slow: 0B fast: 0B
[2020-05-19T15:43:43.962+0100] ThreadLocalAllocBuffer::compute_size(2052) returns 252052
[2020-05-19T15:43:43.962+0100] TLAB: fill thread: 0x76e06f10 [id: 534] desired_size: 976KB slow allocs: 4  refill waste: 15688B alloc: 0.13977     1612KB refills: 2 waste  0.2% gc: 0B slow: 4520B fast: 0B
[2020-05-19T15:43:43.982+0100] ThreadLocalAllocBuffer::compute_size(28878) returns 278878
[2020-05-19T15:43:43.983+0100] TLAB: fill thread: 0x76e06f10 [id: 534] desired_size: 976KB slow allocs: 4  refill waste: 15624B alloc: 0.13977     1764KB refills: 3 waste  0.3% gc: 0B slow: 10424B fast: 0B
[2020-05-19T15:43:44.023+0100] ThreadLocalAllocBuffer::compute_size(4) returns 250004
[2020-05-19T15:43:44.023+0100] TLAB: fill thread: 0x7991df20 [id: 32696] desired_size: 976KB slow allocs: 0  refill waste: 15624B alloc: 0.00132       19KB refills: 1 waste  0.0% gc: 0B slow: 0B fast: 0B

我的Java应用程序在单个使用Java 14的cpu arm7(32位)设备上的Java应用程序在负载下运行多个小时后偶尔崩溃,并且始终在ThreadLocalAllocBuffer :: resize(...

中失败。 [
我认为您可能已经走错了轨道:
与在两个不同的Java版本中存在两个不同的错误相比,您的进程在分配内存方面通常有一个普遍的问题。

您是否已检查进程是否有足够的内存?当进程内存不足时,也会发生分段错误。我还将检查交换文件的配置。几年前,我在Java 8中遇到了无法解释的段错误,它也以某种方式调整大小或分配方法。就我而言,操作系统的交换文件的大小设置为零。

您在错误日志文件的顶部看到什么错误?您仅复制了单线程的信息。

java performance garbage-collection heap-memory
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.