idea编译StackOverflowError问题

本文探讨了Scala编译过程中遇到的StackOverflowError错误,详细分析了错误原因,并提供了具体的解决策略,包括调整JVM参数和优化代码结构,避免大量字符串连接导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Error:scalac: 
     while compiling: E:\XXXXXXXXX.scala
        during phase: erasure
     library version: version 2.10.4
    compiler version: version 2.10.4
  reconstructed args: -classpath F:\BaiduNetdiskDownload\jdk1.7.0_55\jre\lib\charsets.jar;F:\BaiduNetdiskDownload\jdk1.7.0_55\jre\lib\deploy.jar;F:\BaiduNetdiskDownload\jdk1.7.0_55\jre\lib\ext\access-bridge-64.jar;.................
  last tree to typer: TypeTree(class String)
              symbol: class String in package lang (flags: final <java>)
   symbol definition: final class String extends Serializable with Comparable[String] with CharSequence
                 tpe: String
       symbol owners: class String -> package lang
      context owners: method payBase -> object XXX-> package revenue
== Enclosing template or block ==
Apply( // def <init>(parts: Seq[String]): StringContext in class StringContext
  new StringContext."<init>" // def <init>(parts: Seq[String]): StringContext in class StringContext
  Apply( // implicit def wrapRefArray[T <: Object](xs: Array[T]): scala.collection.mutable.WrappedArray[T] in class LowPriorityImplicits
    scala.this."Predef"."wrapRefArray" // implicit def wrapRefArray[T <: Object](xs: Array[T]): scala.collection.mutable.WrappedArray[T] in class LowPriorityImplicits
    ArrayValue(
      <tpt> // tree.tpe=String
      List(
        "INSERT OVERWRITE TABLE XXXXXXXXX PARTITION(STATDATE,DATASOURCE)                                                                                                        "
      )
    )
  )
)
== Expanded type of tree ==
TypeRef(
  TypeSymbol(
    final class String extends Serializable with Comparable[String] with CharSequence
    
  )
)
uncaught exception during compilation: java.lang.StackOverflowError
Java7开始,字符串常量池被移到了Heap空间,Heap空间的大小只受制于机器的真实内存大小,因此,在Java7下使用String.intern()能更有效地减少重复String对象对内存的占用。
参考:https://blog.youkuaiyun.com/u014600432/article/details/50983741
参考:https://blog.youkuaiyun.com/kl28978113/article/details/53031710

 

解决方式:

<plugins>
    <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.15.2</version>
        <executions>
            <execution>
                <goals>
                    <goal>compile</goal>
                    <goal>testCompile</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <scalaVersion>${scala.version}</scalaVersion>
            <args>
                <arg>-target:jvm-1.7</arg>
            </args>
            <!-- jdk7开始字符串常量池被移到了Heap空间,字符串太多要注意uncaught exception during compilation: java.lang.StackOverflowError -->
            <jvmArgs>
                <jvmArg>-Xss20480K</jvmArg>
            </jvmArgs>
        </configuration>
    </plugin>

 

然后这里可能出现Java和Scala混用不知道先编译谁的问题,参考https://davidb.github.io/scala-maven-plugin/example_java.html 我试了没成功,然后我直接将一堆字符串+号连接的换成了三引号加

stripMargin作为一个字符串就好了,也不用插件了;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值