标签: memory-management

编译器可以从堆优化到堆栈分配吗?

就编译器优化而言,将堆分配更改为堆栈分配是否合法和/或可能?或者会破坏as-if规则

例如,假设这是代码的原始版本

{
    Foo* f = new Foo();
    f->do_something();
    delete f;
}
Run Code Online (Sandbox Code Playgroud)

编译器是否能够将此更改为以下内容

{
    Foo f{};
    f.do_something();
}
Run Code Online (Sandbox Code Playgroud)

我不这么认为,因为如果原始版本依赖于自定义分配器之类的东西,那将会产生影响.标准是否对此有具体说明?

c++ memory-management compiler-optimization language-lawyer

63
推荐指数
2
解决办法
3085
查看次数

Java SE 6中Sun的JVM的默认最大堆大小是多少?

来自Java SE 6的Sun JVM的默认最大堆大小是多少(即相当于设置-Xmx)?

对于带有服务器级机器的Java SE 5来说,它是

较小的物理内存的1/4或1GB.

奖金问题:对于IBM的JVM来说,你可以问它

java -verbose:sizes -version
Run Code Online (Sandbox Code Playgroud)

你能同样问Sun的JVM吗?

编辑:

我使用Runtime.getRuntime().maxMemory来确认min(物理内存/ 4,1G),在Sun文档中引用.

java jvm memory-management

62
推荐指数
5
解决办法
11万
查看次数

数组placement-new需要缓冲区中未指定的开销?

[expr.new]C++的5.3.4 2月草案给出了一个例子:

new(2,f) T[5]导致打电话operator new[](sizeof(T)*5+y,2,f).

这里,x和y是非负的未指定值,表示数组分配开销; new-expression的结果将从返回的值中抵消此数量operator new[].这种开销可以应用于所有数组新表达式,包括那些引用库函数operator new[](std::size_t, void*)和其他放置分配函数的表达式.开销的数量可能因新的一次调用而异.- 末端的例子 ]

现在来看以下示例代码:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)

根据上面的引用,第二行将new (buffer) std::string[10]在内部调用operator new[](sizeof(std::string) * 10 + y, buffer)(在构造单个std::string对象之前).问题是如果y > 0,预分配的缓冲区太小了!

那么我如何知道在使用数组放置时预先分配多少内存?

void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)

或者标准某处是否保证y == 0在这种情况下?报价再次说:

这种开销可以应用于所有数组新表达式,包括那些引用库函数operator …

c++ standards memory-management placement-new

62
推荐指数
4
解决办法
5787
查看次数

有没有办法以编程方式确定C++数组的大小?如果没有,为什么?

这个问题的灵感来自一个类似的问题:delete []"如何"知道操作数数组的大小?

我的问题有点不同: 有没有办法以编程方式确定C++数组的大小?如果没有,为什么? 我看到的每个接受数组的函数也需要一个整数参数来赋予它大小.但正如链接问题指出的那样,delete[]必须知道要释放的内存大小.

考虑这个C++代码:

int* arr = new int[256];
printf("Size of arr: %d\n", sizeof(arr));
Run Code Online (Sandbox Code Playgroud)

这打印" Size of arr: 4",这只是指针的大小.有一些打印256的函数会很好,但我不认为C++中存在一个函数.(同样,问题的一部分是为什么它不存在.)

澄清:我知道如果我在堆栈上声明数组而不是堆(即" int arr[256];"),则sizeof运算符将返回1024(数组长度*sizeof(int)).

c++ arrays pointers memory-management

61
推荐指数
4
解决办法
6万
查看次数

Python对象删除自身

为什么这不起作用?我正试图让一个类的实例删除自己.

>>> class A():
    def kill(self):
        del self


>>> a = A()
>>> a.kill()
>>> a
<__main__.A instance at 0x01F23170>
Run Code Online (Sandbox Code Playgroud)

python memory-management instance

61
推荐指数
5
解决办法
11万
查看次数

如何获得可用的内存C++/g ++?

我想根据可用的内存分配我的缓冲区.这样,当我进行处理和内存使用量增加时,仍然保持可用的内存限制.有没有办法获得可用的内存(我不知道虚拟或物理内存状态会有什么不同?).方法必须是平台独立的,因为它将用于Windows,OS X,Linux和AIX.(如果可能的话,我还想为我的应用程序分配一些可用的内存,在执行期间它没有改变的人).

编辑:我用可配置的内存分配做到了.我理解这不是一个好主意,因为大多数操作系统为我们管理内存,但我的应用程序是一个ETL框架(打算在服务器上使用,但也在桌面上用作Adobe indesign的插件).因此,我正在运行以发布因为而不是使用交换,Windows将返回错误的alloc,其他应用程序开始失败.当我被教导避免崩溃等等时,只是试图优雅地降级.

c++ memory-management cross-platform

61
推荐指数
6
解决办法
9万
查看次数

Node.js(和chrome V8)中的内存限制

在网络的许多地方,你会看到:

节点进程的内存限制是多少?

和答案:

目前,默认情况下,v8在32位系统上的内存限制为512mb,在64位系统上的内存限制为1GB.通过将--max-old-space-size设置为最大~1gb(32位)和~1.7gb(64位)可以提高限制,但建议您将单个进程分成几个工作程序如果你达到内存限制.

可以有人确认这是因为node.js似乎经常更新??? *更重要的是,在不久的将来会是这样的吗?*

我想编写javascript代码,可能需要处理4gb的javascript对象(速度可能不是问题)

如果我不能在节点中做到这一点,我将最终在java(在64位机器上)做,但我宁愿不...

memory-management node.js

61
推荐指数
4
解决办法
7万
查看次数

如何监控Java内存使用情况?

我们在Jboss上运行了一个j2ee应用程序,我们希望监视它的内存使用情况.目前我们使用以下代码

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.这意味着它显示了与现实相对应的记忆曲线.当我们从DB创建一个大的xml文件时,曲线会上升,在提取完成后,它会下降.

替代文字

一位顾问告诉我们,明确调用gc()是错误的,"让jvm决定何时运行gc".基本上他的论点与此处讨论的相同.但我还是不明白:

  • 我怎么能有我的记忆力使用曲线?
  • 显式gc()有什么问题?我不关心使用显式gc()可能发生的小的性能问题,我估计会在1-3%.我需要的是内存和线程监视器,它可以帮助我分析我们在客户站点上的系统.

java monitoring garbage-collection memory-management

60
推荐指数
9
解决办法
17万
查看次数

Uint8Array和Uint8ClampedArray之间的区别

Uint8ArrayUint8ClampedArrayJavaScript有什么区别?据我所知,Uint8ClampedArray它与画布一起用于像素操作.为什么这样做有什么好处?

javascript arrays memory-management clamp

60
推荐指数
1
解决办法
8930
查看次数

64位JVM限制为300GB内存?

我试图在集群计算环境(运行CentOS版本6.2 Final的IBM LSF)上运行Java应用程序,它可以为我提供高达1TB的RAM空间.

我可以创建一个具有高达300GB最大内存(Xmx)的JVM,虽然我需要更多内容(如果需要,我可以提供详细信息).

但是,使用Xmx选项创建具有超过300GB最大内存的JVM似乎是不可能的.更具体地说,我收到了经典的错误消息:

VM初始化期间发生错误.

无法为对象堆保留足够的空间.

我的(64位)JVM的详细信息如下:

OpenJDK运行时环境(IcedTea6 1.10.6)(rhel-1.43.1.10.6.el6_2-x86_64)

OpenJDK 64位服务器VM(内置20.0-b11,混合模式)

我也尝试过使用Java 7 64位JVM,但我遇到了完全相同的问题.

此外,我尝试创建一个JVM来运行HelloWorld.jar,但是如果你要求超过-Xmx300G,JVM创建仍然会失败,所以我认为它与特定应用程序没有任何关系.


有谁知道为什么我不能创建超过300G的最大内存的JVM?

任何人都可以建议解决方案/解决方法吗?

java jvm memory-management cluster-computing

59
推荐指数
3
解决办法
4398
查看次数