diff --git a/project.clj b/project.clj
index f2251cf64f8f107150fd6a3ee5c57663bcdd622b..4255611539921674a519931e764ff60ab467f205 100644
--- a/project.clj
+++ b/project.clj
@@ -59,6 +59,12 @@
   :profiles {:dev {:dependencies [[clj-http "1.0.1"]                         ; HTTP Client
                                   [expectations "2.0.16"]   ; unit tests
                                   [ring/ring-mock "0.2.0"]]
-                   :jvm-opts ["-Dlogfile.path=target/log -XX:PermSize=64m -XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"]}
+                   :jvm-opts ["-Dlogfile.path=target/log"
+                              "-Xms1024m"                     ; give JVM a decent heap size to start with
+                              "-Xmx2048m"                     ; hard limit of 2GB so we stop hitting the 4GB container limit on CircleCI
+                              "-XX:PermSize=64m"              ; start with a little more PermGen space
+                              "-XX:MaxPermSize=128m"          ; a little more headroom for PermGen
+                              "-XX:+CMSClassUnloadingEnabled" ; let Clojure's dynamically generated temporary classes be GC'ed from PermGen
+                              "-XX:+UseConcMarkSweepGC"]}     ; Concurrent Mark Sweep GC needs to be used for Class Unloading (above)
              :uberjar {:aot :all
                        :prep-tasks ["npm" "gulp" "javac" "compile"]}})