就编译器优化而言,将堆分配更改为堆栈分配是否合法和/或可能?或者会破坏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)
我不这么认为,因为如果原始版本依赖于自定义分配器之类的东西,那将会产生影响.标准是否对此有具体说明?
来自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文档中引用.
[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 …
这个问题的灵感来自一个类似的问题: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)).
为什么这不起作用?我正试图让一个类的实例删除自己.
>>> class A():
def kill(self):
del self
>>> a = A()
>>> a.kill()
>>> a
<__main__.A instance at 0x01F23170>
Run Code Online (Sandbox Code Playgroud) 我想根据可用的内存分配我的缓冲区.这样,当我进行处理和内存使用量增加时,仍然保持可用的内存限制.有没有办法获得可用的内存(我不知道虚拟或物理内存状态会有什么不同?).方法必须是平台独立的,因为它将用于Windows,OS X,Linux和AIX.(如果可能的话,我还想为我的应用程序分配一些可用的内存,在执行期间它没有改变的人).
编辑:我用可配置的内存分配做到了.我理解这不是一个好主意,因为大多数操作系统为我们管理内存,但我的应用程序是一个ETL框架(打算在服务器上使用,但也在桌面上用作Adobe indesign的插件).因此,我正在运行以发布因为而不是使用交换,Windows将返回错误的alloc,其他应用程序开始失败.当我被教导避免崩溃等等时,只是试图优雅地降级.
在网络的许多地方,你会看到:
节点进程的内存限制是多少?
和答案:
目前,默认情况下,v8在32位系统上的内存限制为512mb,在64位系统上的内存限制为1GB.通过将--max-old-space-size设置为最大~1gb(32位)和~1.7gb(64位)可以提高限制,但建议您将单个进程分成几个工作程序如果你达到内存限制.
可以有人确认这是因为node.js似乎经常更新??? *更重要的是,在不久的将来会是这样的吗?*
我想编写javascript代码,可能需要处理4gb的javascript对象(速度可能不是问题)
如果我不能在节点中做到这一点,我将最终在java(在64位机器上)做,但我宁愿不...
我们在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".基本上他的论点与此处讨论的相同.但我还是不明白:
Uint8Array和Uint8ClampedArrayJavaScript有什么区别?据我所知,Uint8ClampedArray它与画布一起用于像素操作.为什么这样做有什么好处?
我试图在集群计算环境(运行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?
任何人都可以建议解决方案/解决方法吗?