有没有人知道一个工具来直观地显示在Ubuntu上选定的进程的内存使用情况? ps aux会显示一个数字快照,但是我真的很喜欢我可以看到的一个改变,因为我锤击这个过程并希望看到意外的行为。 有没有人有任何build议?
我正在讨论如何保护存储在Java程序中的敏感信息(例如密码)。 根据安全要求,将清除包含敏感信息的内存,例如将字节值设置为全零。 担心的是攻击者可以观察与应用程序进程相关的内存,所以我们要尽可能地限制这种敏感信息的时间窗口。 以前,项目涉及C ++,因此memset()已经足够了。 (顺便说一句,memset()的使用已经成为问题,因为已知某些编译器会根据假设来优化它的使用,因为以后不会使用内存,所以不需要将其归零第一个地方,这个blurb对于那些Google为“memset”和“清除内存”的人来说是一个免责声明)。 现在,我们已经掌握了一个Java项目,正在按这个要求。 对于Java对象,我的理解是: 一个空引用只改变引用的值; 对象的堆上的内存仍然包含数据 一个像String这样的不可变对象将无法修改数据(或者至less不是很容易的,在具有相应的安全pipe理器的虚拟机的范围内) 代代垃圾收集者可以在整个地方复制物体(如这里所述 ) 而对于原始的,我的理解是: 本地方法中的原始typesvariables将被分配到堆栈上,并且: 当你改变它的值的时候,你直接在内存中修改它(而不是使用引用来处理堆上的对象)。 在某些情况下,副本可以/在“幕后”进行,例如将其作为parameter passing给方法或装箱(自动或不是)创build包含另一个具有相同值的原始variables的包装的实例。 我的同事声称,Java原语是不可改变的,NSA和Oracle都有文档说明在这种需求方面缺乏对Java的支持。 我的立场是,基元可以(至less在某些情况下)通过将值设置为零(或布尔值为false)来清零,并且内存以这种方式被清除。 我试图validationJLS或其他“官方”文档中是否存在关于JVM在涉及基元的内存pipe理时所需行为的语言。 我能find的最接近的是Oracle网站上的“Java编程语言安全编码指南” ,其中提到了在使用后清除字符数组。 当我的同事把原始的东西称为不可改变的时候,我会质疑定义,但我很确定他的意思是“记忆不能适当地调零” – 我们不用担心。 我们没有讨论他是否意味着最后的变数 – 从我们一般说的上下文来看。 有没有什么明确的答案或参考? 我会很感激任何可以告诉我我错在哪里或确认我是对的。 编辑 :经过进一步的讨论,我已经能够澄清,我的同事想到的是原始包装,而不是原始本身。 所以我们留下的是如何安全地清理内存,最好是对象的原始问题。 另外,为了说明,敏感信息不仅仅是密码,还包括IP地址或encryption密钥等。 有没有商业JVM提供像某些对象的优先处理function? (我想这实际上违反了Java规范,但我想我会问,以防万一我错了。)
我有一个超过600×800像素JPEG的画廊OutOfMemoryexception。 环境 我一直在用600×800像素的JPG图片来使用Gallery。 由于我的内容可能比图片稍微复杂一些,因此我将每个视图都设置为一个将ImageView换成JPG的RelativeLayout。 为了“加快”用户体验,我有一个简单的4槽高速caching(在循环中),左边1个图像和右边1个图像预取到显示的图像,并保留在4槽HashMap中。 该平台 我正在使用256 RAM和128堆大小的AVD,以及600×800的屏幕。 它也发生在Entourage Edge目标上,除了使用设备更难debugging。 问题 我已经得到一个例外: OutofMemoryError: bitmap size exceeds VM budget 当获取第五张图片时会发生这种情况。 我试图改变我的图像caching的大小,它仍然是一样的。 奇怪的事情:不应该有一个记忆问题 为了确保堆的限制与我所需要的距离相去甚远,我在开始时定义了一个虚拟的8MB数组,并将其保留为未引用状态,以便立即派发。 它是活动线程的成员,定义如下 static { @SuppressWarnings("unused") byte dummy[] = new byte[ 8*1024*1024 ]; } 结果是堆大小接近11MB,而且全部是免费的。 注意我开始崩溃后添加了这个技巧。 这使得OutOfMemory不那么频繁。 现在,我正在使用DDMS。 就在崩溃之前(在崩溃之后变化不大),DDMS显示: ID Heap Size Allocated Free %Used #Objects 1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156 […]
有没有办法在内存中保留一个结果variables,所以我不必每次运行我的脚本的开始时重新计算它? 每当我运行我的脚本时,我正在对一个数据集(我正在从磁盘读取)进行一系列长的(5-10秒)的精确操作。 这不会是太多的问题,因为我非常擅长使用交互式编辑器在运行之间debugging我的代码; 然而有时交互function不能削减它。 我知道我可以把结果写到磁盘上的文件中,但是如果可能的话,我想避免这样做。 这应该是一个解决scheme,它在我第一次运行脚本时生成一个variables,并将其保存在内存中,直到shell本身closures,或者直到我明确地告诉它为止。 像这样的东西: # Check if variable already created this session in_mem = var_in_memory() # Returns pointer to var, or False if not in memory yet if not in_mem: # Read data set from disk with open('mydata', 'r') as in_handle: mytext = in_handle.read() # Extract relevant results from data set mydata […]
我和其他许多人使用智能指针在C ++中使用诸如RAII等这样的东西来包装不安全的内存操作,取得了巨大的成功。 但是,如果有析构函数,类,操作符重载等,则包装内存pipe理更容易实现。 对于使用原始C99编写的程序,您可以在哪里指出(无意双关)来帮助安全的内存pipe理? 谢谢。
有没有一个标准的方法来看看你的应用程序有多less堆栈空间,以及堆栈使用的最高水印是在运行期间? 另外在实际溢出的可怕情况下会发生什么? 它是否会崩溃,触发exception或信号? 在所有系统和编译器中是否有标准或不同? 我正在寻找Windows,Linux和Macintosh。
例如,我有一个已知sizeof(A)和sizeof(B)的std :: map,而map里面有N个条目。 你如何估计它的内存使用量? 我会说这是类似的 (sizeof(A) + sizeof(B)) * N * factor 但是,这个因素是什么? 不同的公式可能? 也许要求上限更容易?
考虑下面的HashMap.clear()代码: /** * Removes all of the mappings from this map. * The map will be empty after this call returns. */ public void clear() { modCount++; Entry[] tab = table; for (int i = 0; i < tab.length; i++) tab[i] = null; size = 0; } 看来, Entry对象的内部数组( table )永远不会收缩。 所以,当我将10000个元素添加到地图中,然后调用map.clear() ,它将在内部数组中保留10000个空值。 所以,我的问题是,JVM如何处理这个没有任何数组的数组,因此HashMap内存是有效的?
我遇到了这个关于词典memory management的问题 ,里面提到了实习function。 它究竟做了什么,什么时候使用? 举个例子: 如果我有一个名为看到 ,包含元组forms(string1,string2),我用来检查重复,将存储(内部(string1),内部(string2))提高性能和内存或速度?
我试图find使用ant内存分析器的内存泄漏,我遇到了一个新的术语: 固定对象。 有人可以给我一个很好的和简单的解释这个对象是什么,我怎么能pinn / unpinn对象,并检测谁固定对象? 谢谢