【发布时间】:2026-01-23 16:40:06
【问题描述】:
我的 spark 工作是创建很多小对象并遇到垃圾收集问题。我尝试了多种方法将 double 转换为具有 10 位精度的字符串,而无需科学记数法。
第一道
String.format("%.10f", denomValue)
这个案例的错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
at sun.misc.FormattedFloatingDecimal.create(FormattedFloatingDecimal.java:254)
at sun.misc.FormattedFloatingDecimal.fillDecimal(FormattedFloatingDecimal.java:267)
at sun.misc.FormattedFloatingDecimal.<init>(FormattedFloatingDecimal.java:76)
at sun.misc.FormattedFloatingDecimal.valueOf(FormattedFloatingDecimal.java:38)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:3298)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:3238)
at java.util.Formatter$FormatSpecifier.printFloat(Formatter.java:2802)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2753)
at java.util.Formatter.format(Formatter.java:2520)
at java.util.Formatter.format(Formatter.java:2455)
at java.lang.String.format(String.java:2925)
第二种方式
new BigDecimal(d).setScale(10,BigDecimal.ROUND_UP).toPlainString()
这种情况下的错误:-
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.math.MutableBigInteger.divideMagnitude(MutableBigInteger.java:1489)
at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1227)
at java.math.MutableBigInteger.divide(MutableBigInteger.java:1153)
at java.math.MutableBigInteger.divide(MutableBigInteger.java:1147)
at java.math.BigDecimal.divideAndRound(BigDecimal.java:4326)
at java.math.BigDecimal.setScale(BigDecimal.java:2470)
【问题讨论】:
-
我不会想象转换本身会耗尽内存 - 更有可能是保留一堆源值和转换后的值
标签: java apache-spark garbage-collection