我有java堆内存的一个问题.我在java中开发了一个客户端服务器应用程序,它作为Windows服务运行,需要超过512MB的内存.我有2GB的RAM,但是当我运行我的应用程序时,它会引发异常
内存不足错误:java堆空间
但我已经在java控制面板中设置了堆大小(最大512MB),我仍然得到相同的错误.我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,所以如何增加默认堆大小?
众所周知,可以限制Java堆大小-Xmx<amount><unit>,其中unit数据量单位如Gigabyte,Megabyte等.我知道这-Xmx128M意味着128 Mebibytes(= 128*1024*1024字节).
但这是真的-Xmx100m
吗,也可以使用兆字节使用的十进制单位(这将是100*1000*1000字节)?
那么是否可以通过使用小写单位后缀k, m, g来代替K, M, G?来使用这个十进制单位?
不确定如何标题,但问题是:
我听说程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉.这与每次需要内存时简单地访问操作系统形成对比.我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本.
我相信JVM会这样做,维护自己的内存部分,然后从中分配对象.
我的问题是,如何实际实现这一点?
谢谢,dragonwrenn
几周前,我发现C#中的字符串被定义为引用类型而不是值类型.最初我对此感到困惑,但经过一些阅读后,我突然明白了为什么将字符串存储在堆而不是堆栈上是很重要的 - 因为将一个非常大的字符串复制到一个不可预测的数字上是非常低效的堆栈帧.我完全接受这个.
我觉得我的理解几乎已经完成,但是我缺少一个元素 - 字符串用什么语言来保持它们不变?用代码示例来说明:
string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";
Assert.AreEqual("FirstValue", valueB); // Passes
Run Code Online (Sandbox Code Playgroud)
当我将valueA分配给valueB时,我不明白哪个语言功能会复制valueA.或者,当我将valueA赋值给valueB时,对valueA的引用不会改变,只有valueA在设置字符串时才会获得对自身的新引用.由于这是一个实例类型,我不明白为什么这样做.
我知道你可以重载,例如,==和!=运算符,但我似乎找不到有关重载=运算符的任何文档.解释是什么?
我是一个相当有经验的OpenMP用户,但我遇到了一个令人费解的问题,我希望有人可以提供帮助.问题是,一个简单的哈希算法对堆栈分配的数组表现良好,但对堆上的数组表现不佳.
下面的示例使用i%M(i模数M)来计算相应阵列元素中的每个第M个整数.为简单起见,假设N = 1000000,M = 10.如果N%M == 0,那么结果应该是bins []的每个元素都等于N/M:
#pragma omp for
for (int i=0; i<N; i++)
bins[ i%M ]++;
Run Code Online (Sandbox Code Playgroud)
数组bins []对每个线程都是私有的(我在之后对关键部分中所有线程的结果进行求和).
当在堆栈上分配bins []时,程序运行良好,性能与内核数量成比例缩放.
但是,如果bin []在堆上(指向bin []的指针在堆栈上),性能会急剧下降.这是一个重大问题!
我希望使用OpenMP将某些数据的binning(散列)并行化为堆数组,这是一个重大的性能影响.
绝对不是像所有线程试图写入同一内存区域那样愚蠢的东西.这是因为每个线程都有自己的bins []数组,结果对于堆栈和堆栈分配的bin都是正确的,并且单线程运行的性能没有差别.我使用GCC和英特尔C++编译器在不同的硬件(Intel Xeon和AMD Opteron)上重现了这个问题.所有测试都在Linux(Ubuntu和RedHat)上进行.
似乎没有理由将OpenMP的良好性能限制在堆栈数组中.
任何猜测?也许对线程的访问是通过Linux上的某种共享网关进行的?我该如何解决这个问题?
完整的程序如下:
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main(const int argc, const char* argv[])
{
const int N=1024*1024*1024;
const int M=4;
double t1, t2;
int checksum=0;
printf("OpenMP threads: %d\n", omp_get_max_threads());
//////////////////////////////////////////////////////////////////
// Case 1: stack-allocated array
t1=omp_get_wtime();
checksum=0;
#pragma omp parallel
{ // Each openmp thread …Run Code Online (Sandbox Code Playgroud) 我是C++新线程的新手,我试图清楚地了解线程之间如何共享/不共享内存.我正在使用std::threadC++ 11.从我在其他SO问题上看到的,堆栈内存只由一个线程拥有,堆内存在线程之间共享.所以从我认为我对堆栈与堆的理解,以下内容应该是正确的:
#include <thread>
using namespace std;
class Obj {
public:
int x;
Obj(){x = 0;}
};
int main() {
Obj stackObj;
Obj *heapObj = new Obj();
thread t([&]{
stackObj.x++;
heapObj->x++;
});
t.join();
assert(heapObj->x == 1);
assert(stackObj.x == 0);
}
Run Code Online (Sandbox Code Playgroud)
请原谅我,如果我搞砸了一堆东西,lambda语法对我来说是非常新的.但希望我正在努力做的是连贯的.这会像我期望的那样表现吗?如果没有,我有什么误解?
偶然发现这个面试问题,
在C中,给定一个变量x,如何确定该变量的空间是在堆栈还是堆上分配?
(有没有办法以编程方式找到它而不必通过符号表等?并且确定是否在堆栈或堆中分配空间有任何实际意义吗?)
在运行RJDBC 0.2-4的dbGetQuery时出现以下错误:
Error in .jcall(rp, "I", "fetch", stride) :
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
以下是我的代码:
Sys.setenv(JAVA_HOME='C:/Program Files (x86)/Java/jdk1.7.0_25')
options(java.parameters='-Xmx1g')
library(rJava)
library(rjson)
library(RJDBC)
# Output Java version
.jinit()
print(.jcall("java/lang/System", "S", "getProperty", "java.version"))
jdbcDriver <<- JDBC(driverClass="oracle.jdbc.OracleDriver", classPath="C:/lib/dashboard_lib/ojdbc6.jar")
jdbcConnection <<- dbConnect(jdbcDriver, "...", "...", "...")
dataset <<- dbGetQuery(jdbcConnection, "select * from OPR_DATA.MV_REG_CTRY_MS_QUARTER_AMT")
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我,非常感谢提前