Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

On scala project - Getting error GC overhead limit exceeded when running sbt test command

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?

like image 261
Anang Satria Avatar asked Feb 14 '19 03:02

Anang Satria


2 Answers

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.

EDIT:

If anyone using IntelliJ IDEA like me, you can increase the sbt memory usage using the VM Parameters as in the picture below.

-Xmx4G

enter image description here

like image 102
Anang Satria Avatar answered Sep 18 '22 05:09

Anang Satria


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.

like image 39
Mario Galic Avatar answered Sep 19 '22 05:09

Mario Galic