我试图找出我的对象需要多少内存才能看到它们中有多少内存在大对象堆上(超过85,000字节).
对于每个对象的任何引用类型等,添加4为int,8为长,4(或8如果你在64位)是简单的,或者是方法,属性等的开销.
除非您正在编程操作系统或嵌入式系统的某些部分,否则有任何理由这样做?我可以想象,对于一些特定的类经常重载内存管理函数或引入一个对象池而创建和销毁的类可能会降低开销,但是在全局范围内做这些事情?
另外
我刚刚在重载的删除功能中发现了一个错误 - 内存并不总是被释放.这是一个不那么重要的内存关键应用程序.此外,禁用这些过载会使性能降低约0.5%.
我知道根据C++标准,如果新的无法分配内存,它应该抛出std :: bad_alloc异常.但我听说有些编译器如VC6(或CRT实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查NULL会使代码看起来非常难看.
帮助我解决与同事之间的争议:在Java中将变量或集合设置为null有助于垃圾收集并减少内存使用吗?如果我有一个长时间运行的程序,并且可以迭代地调用每个函数(可能数千次):在将值返回到父函数之前将其中的所有变量设置为null有助于减少堆大小/内存使用量吗?
在C API中分配内存的正确/首选方法是什么?
我首先看到两个选项:
1)让调用者完成所有(外部)内存处理:
myStruct *s = malloc(sizeof(s));
myStruct_init(s);
myStruct_foo(s);
myStruct_destroy(s);
free(s);
Run Code Online (Sandbox Code Playgroud)
该_init和_destroy功能是必需的,因为一些更多的内存可分配里面,而且必须在某个地方处理.
这样做的缺点是更长,但在某些情况下也可以消除malloc(例如,它可以传递给堆栈分配的结构:
int bar() {
myStruct s;
myStruct_init(&s);
myStruct_foo(&s);
myStruct_destroy(&s);
}
Run Code Online (Sandbox Code Playgroud)
此外,调用者必须知道结构的大小.
2)隐藏mallocs in _init和freein in _destroy.
优点:代码更短,因为无论如何都会调用函数.完全不透明的结构.
缺点:无法传递以不同方式分配的结构.
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
Run Code Online (Sandbox Code Playgroud)
我目前正在倾向于第一个案例; 然后,我不知道C API设计.
有没有其他人,他们在iOS 6应用程序中使用地图,注意到极高的内存使用,一直到接收内存警告到崩溃的应用程序?
我通过仪器运行应用程序,我没有看到任何泄漏,直到创建地图视图,应用程序始终以大约3mb Live Bytes运行.创建地图并下载切片后,Live Bytes会跳至~13mb Live Bytes.然后,当我移动地图并放大和缩小Live Bytes连续体时,直到应用程序崩溃在大约40mb Live Bytes.顺便提一下,这是在iPhone 4上.在iPod touch上它甚至更早崩溃.
我正在重复使用注释视图,没有任何泄漏.是否有其他人在使用新的iOS 6地图时看到了相同的高内存使用量?还有,有没有人有解决方案?
假设我们有三个对象:祖父母,父母和孩子.祖父母保留父母,父母保留孩子,孩子保留父母.祖父母释放父母.
在这种情况下会发生什么?
memory-management objective-c ios automatic-ref-counting retain-cycle
我们有一个长期存在的服务器进程,很快就需要大量的RAM.我们看到,一旦JVM从操作系统获得内存,它就永远不会将其返回给操作系统.我们如何要求JVM将堆内存返回给操作系统?
通常,这些问题的接受答案是使用
-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio.(参见例如
1,2,3,4).但是我们像这样运行java:
java -Xmx4G -XX:MaxHeapFreeRatio=50 -XX:MinHeapFreeRatio=30 MemoryUsage
Run Code Online (Sandbox Code Playgroud)
仍然在VisualVM中看到这个:
显然,JVM并不尊重,-XX:MaxHeapFreeRatio=50因为heapFreeRatio非常接近100%而且远不及50%.无需点击"执行GC"即可将内存返回给操作系统.
MemoryUsage.java:
import java.util.ArrayList;
import java.util.List;
public class MemoryUsage {
public static void main(String[] args) throws InterruptedException {
System.out.println("Sleeping before allocating memory");
Thread.sleep(10*1000);
System.out.println("Allocating/growing memory");
List<Long> list = new ArrayList<>();
// Experimentally determined factor. This gives approximately 1750 MB
// memory in our installation.
long realGrowN = 166608000; //
for (int i = 0 ; i < realGrowN …Run Code Online (Sandbox Code Playgroud) 我想知道常量变量存储在哪里.它与全局变量在同一个内存区域吗?还是在堆栈上?
有一种方法调用foo有时会返回以下错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Abort
Run Code Online (Sandbox Code Playgroud)
有没有我可以用一种方式try- catch块从终止我的程序停止这个错误(所有我想要做的就是回报-1)?
如果是这样,它的语法是什么?
我还能用bad_allocC++ 处理什么?
c++ ×3
c ×2
java ×2
memory ×2
.net ×1
api ×1
bad-alloc ×1
constants ×1
globals ×1
heap-memory ×1
ios ×1
ios6 ×1
ios6-maps ×1
malloc ×1
mkmapview ×1
new-operator ×1
objective-c ×1
overloading ×1
performance ×1
profiling ×1
retain-cycle ×1
variables ×1
visual-c++ ×1
visual-c++-6 ×1