On scala project - Getting error GC overhead limit

2020-08-15 07:47发布

问题:

I'm new in scala programming and getting GC overhead limit exceeded error when I execute sbt test command in one of big scala project. Anyone knows how can I solve this?

回答1:

I got help from my friends :)

Increase the memory option by executing with -mem option for example:

sbt -mem 2048 test

Other options:

For Mac & Linux user:

if we need to execute this a lot. We can update the .bash_profile file and add below command:

export SBT_OPTS="-Xmx2G"

Other solution (works with Windows as well):

There's also a specific sbtopts file where you can persist this memory setting:

Find a file in Mac/Linux: /usr/local/etc/sbtopts Or in Windows C:\Program Files (x86)\sbt\conf

and add below configuration:

# set memory options
#
-mem   2048

Hopefully any of these tips will help someone with this problem.



回答2:

Having a look at the launcher script for running sbt, which on my system resides at /usr/share/sbt/bin/sbt, we see the following:

declare -r sbt_opts_file=".sbtopts"
declare -r etc_sbt_opts_file="/etc/sbt/sbtopts"
declare -r dist_sbt_opts_file="${sbt_home}/conf/sbtopts"

...

# Here we pull in the default settings configuration.
[[ -f "$dist_sbt_opts_file" ]] && set -- $(loadConfigFile "$dist_sbt_opts_file") "$@"

# Here we pull in the global settings configuration.
[[ -f "$etc_sbt_opts_file" ]] && set -- $(loadConfigFile "$etc_sbt_opts_file") "$@"

#  Pull in the project-level config file, if it exists.
[[ -f "$sbt_opts_file" ]] && set -- $(loadConfigFile "$sbt_opts_file") "$@"

#  Pull in the project-level java config, if it exists.
[[ -f ".jvmopts" ]] && export JAVA_OPTS="$JAVA_OPTS $(loadConfigFile .jvmopts)"

run "$@"

Thus we can put configuration settings in:

.jvmopts
.sbtopts
/etc/sbt/sbtopts
${sbt_home}/conf/sbtopts

For example, typelevel/cats project uses .jvmopts to set -Xmx3G. Alternatively we could do

echo "-mem 2048" >> .sbtopts

Regarding environmental variablessbt -h documents that

  JAVA_OPTS          environment variable, if unset uses "$java_opts"
  .jvmopts           if this file exists in the current directory, its contents
                     are appended to JAVA_OPTS
  SBT_OPTS           environment variable, if unset uses "$default_sbt_opts"
  .sbtopts           if this file exists in the current directory, its contents
                     are prepended to the runner args

For example,

export JAVA_OPTS=-Xmx2G
sbt

should run sbt with 2G of memory.

Note that if you are running tests in forked JVM, then you can increase memory via javaOptions setting in build.sbt like so:

Test / fork := true
Test / javaOptions ++= Seq("-Xmx4G")

VisualVM is a useful tool to see what settings were passed to a JVM process when experimenting with different ways of configuring SBT.