diff -Naur cacao/cacao/src/vm/options.cpp cacao/cacao/src/vm/options.cpp --- cacao/cacao/src/vm/options.cpp 2014-12-12 21:14:45.000000000 +0000 +++ cacao/cacao/src/vm/options.cpp 2015-12-23 21:01:37.644275263 +0000 @@ -26,6 +26,7 @@ #include "config.h" #include +#include #include #include #include @@ -60,9 +61,9 @@ bool opt_run = true; -s4 opt_heapmaxsize = 0; /* maximum heap size */ -s4 opt_heapstartsize = 0; /* initial heap size */ -s4 opt_stacksize = 0; /* thread stack size */ +size_t opt_heapmaxsize = 0; /* maximum heap size */ +size_t opt_heapstartsize = 0; /* initial heap size */ +size_t opt_stacksize = 0; /* thread stack size */ bool opt_verbose = false; bool opt_debugcolor = false; /* use ANSI terminal sequences */ diff -Naur cacao/cacao/src/vm/options.hpp cacao/cacao/src/vm/options.hpp --- cacao/cacao/src/vm/options.hpp 2014-12-12 21:14:45.000000000 +0000 +++ cacao/cacao/src/vm/options.hpp 2015-12-23 21:01:37.645275246 +0000 @@ -26,6 +26,7 @@ #ifndef OPTIONS_HPP_ #define OPTIONS_HPP_ 1 +#include // for size_t #include // for int64_t #include // for FILE #include "config.h" // for ENABLE_DEBUG_FILTER, etc @@ -77,9 +78,9 @@ extern bool opt_jar; extern bool opt_run; -extern s4 opt_heapmaxsize; -extern s4 opt_heapstartsize; -extern s4 opt_stacksize; +extern size_t opt_heapmaxsize; +extern size_t opt_heapstartsize; +extern size_t opt_stacksize; extern bool opt_verbose; extern bool opt_debugcolor; diff -Naur cacao/cacao/src/vm/vm.cpp cacao/cacao/src/vm/vm.cpp --- cacao/cacao/src/vm/vm.cpp 2014-12-12 21:14:45.000000000 +0000 +++ cacao/cacao/src/vm/vm.cpp 2015-12-23 21:01:38.046268504 +0000 @@ -29,9 +29,14 @@ #include #include #include +#include #include #include +#if defined(__LINUX__) +#include +#endif + #include "md-abi.hpp" #include "mm/codememory.hpp" @@ -690,6 +695,19 @@ opt_heapstartsize = HEAP_STARTSIZE; opt_stacksize = STACK_SIZE; +#if defined(__LINUX__) + // Calculate 1/4 of the physical memory. + size_t qmem = sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) / 4; + + if (qmem > INT32_MAX) { + // Allocate no more than 2GB. + opt_heapmaxsize = INT32_MAX; + } else if (qmem > HEAP_MAXSIZE) { + // Otherwise use this if greater than default (128MB). + opt_heapmaxsize = qmem; + } +#endif + // First of all, parse the -XX options. options_xx(vm_args); @@ -896,18 +914,33 @@ case OPT_SS: { char c; - int j; + size_t j; + errno = 0; c = opt_arg[strlen(opt_arg) - 1]; + j = strtoul(opt_arg, NULL, 10); + + if (errno) + break; // Invalid. if ((c == 'k') || (c == 'K')) { - j = atoi(opt_arg) * 1024; + if (j > SIZE_MAX / 1024) + break; // Overflow. + else + j *= 1024; } else if ((c == 'm') || (c == 'M')) { - j = atoi(opt_arg) * 1024 * 1024; - - } else - j = atoi(opt_arg); + if (j > SIZE_MAX / 1024 / 1024) + break; // Overflow. + else + j *= 1024 * 1024; + + } else if ((c == 'g') || (c == 'G')) { + if (j > SIZE_MAX / 1024 / 1024 / 1024) + break; // Overflow. + else + j *= 1024 * 1024 * 1024; + } if (opt == OPT_MX) opt_heapmaxsize = j; @@ -1498,9 +1531,9 @@ void VM::print_run_time_config() { puts("Run-time variables:\n"); - printf(" maximum heap size : %d\n", opt_heapmaxsize); - printf(" initial heap size : %d\n", opt_heapstartsize); - printf(" stack size : %d\n", opt_stacksize); + printf(" maximum heap size : %lu\n", opt_heapmaxsize); + printf(" initial heap size : %lu\n", opt_heapstartsize); + printf(" stack size : %lu\n", opt_stacksize); #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) printf(" gnu.classpath.boot.library.path: %s\n", _properties.get("gnu.classpath.boot.library.path"));