如何在IntelliJ中为Scala程序减少JVM内存分配
如何在IntelliJ中调整JVM内存以触发OutOfMemoryError
我懂你想快速触发内存溢出异常的需求,之前你踩了参数用错的坑,咱们来把这个问题捋清楚:
正确的JVM内存限制方法
要限制JVM的堆内存,你需要用标准JVM参数,而不是那些Spark专属的参数:
- 打开IntelliJ的「运行配置」,找到「VM选项」输入框(注意不是「程序参数」),填入
-Xmx<内存大小>格式的参数,比如-Xmx3m(表示最大堆内存为3MB)。你可以根据需要调整数值,比如-Xmx2m会让内存更紧张,触发异常更快。
你之前操作的问题解析
--scala.driver.memory和--driver.memory是Spark框架用来设置Driver节点内存的参数,普通Scala独立程序根本不认这些参数,所以JVM启动直接报错。- 把这些参数放到「程序参数」里也没用,因为程序参数是传递给你的Scala主函数的,JVM不会把它们当作内存配置来解析。
关于你后续的成功尝试
你改成用自定义链表HisList累积数据,配合-Xmx3m成功触发异常,这个思路非常对:
- Scala的字符串是不可变的,每次拼接都会生成新字符串,旧的字符串对象会被垃圾回收器(GC)清理,反而很难快速占满内存。
- 而自定义链表会持有所有之前节点的引用,这些对象不会被GC回收,内存会持续累积,再加上
-Xmx的限制,自然就很快触发OutOfMemoryError了。
额外小技巧(用字符串也能快速触发)
如果还是想用字符串来测试,你可以把字符串放到一个不会被GC回收的集合里,比如ListBuffer:
import scala.collection.mutable.ListBuffer def OOMCrasher(buffer: ListBuffer[String]): ListBuffer[String] = { buffer += "ADSJKFAKLWJEFLASDAFSDFASDFASERASDFASEASDFASDFASERESFDHFDYJDHJSDGFAERARDSHFDGJGHYTDJKXJCV" OOMCrasher(buffer) } OOMCrasher(ListBuffer.empty)
配合-Xmx3m的VM参数,也能快速触发内存溢出异常。
内容的提问来源于stack exchange,提问作者Sahand
相关产品推荐
相关产品推荐

