Tag: memory management

我的代码中的内存不足exception

我正在运行代码长时间作为Oracle数据库压力测试的一部分并使用java版本“1.4.2”。 简而言之,我所做的是: while(true) { Allocating some memory as a blob byte[] data = new byte[1000]; stmt = fConnection.prepareStatement(query); // [compiling an insert query which uses the above blob] stmt.execute(); // I insert this blob-row in the database. stmt.close(); } 现在我想运行这个测试8-10小时。 然而,显然在插入大约1500万条记录后,我点击了java.lang.OutOfMemoryError 我用-Xms512m -Xmx2g运行它。 我尝试使用更高的值,但我似乎没有那么多的硬件,我认为它不是req: java -Xms512m -Xmx4g -jar XX.jar Invalid maximum heap size: -Xmx4g The […]

Java MemoryMapping大文件

MappedByteBuffer对2GIG的Java限制使得用于映射大文件变得棘手。 通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引: long PAGE_SIZE = Integer.MAX_VALUE; MappedByteBuffer[] buffers; private int getPage(long offset) { return (int) (offset / PAGE_SIZE) } private int getIndex(long offset) { return (int) (offset % PAGE_SIZE); } public byte get(long offset) { return buffers[getPage(offset)].get(getIndex(offset)); } 这可能适用于单个字节,但如果要处理更大且需要跨越边界的读/写(getLong()或get(byte [])),则需要重写大量代码。 问题是:对于这些场景,你最好的做法是什么,你知道任何可以重复使用的工作解决方案/代码而不重新发明轮子吗?

什么更有效率? 清空一个对象或创建一个新对象?

“新”有多贵? 我的意思是,我是否应该重新使用相同的对象,或者如果对象是“超出范围”,它与清空它是一样的吗? 例如,假设一个方法创建一个列表: List list = new ArrayList(); 在方法的最后,列表不再使用 – 它是否意味着没有分配给它的内存,或者它是否意味着有一个指向它的空指针(因为它是’创建’)。 或者,我可以向方法发送一个’list’,并在方法的末尾清空它: list.removeAll(list); 从记忆的角度来看会有什么不同吗? 谢谢!

R H2O – 内存管理

我试图通过R使用H2O来使用一个大数据集(~10GB)的子集构建多个模型。 数据是一年的数据,我正在尝试建立51个模型(即第1周训练,第2周预测等),每周约有1.5-250万行,有8个变量。 我已经在循环中完成了这个,我知道这并不总是R中最好的方法。我发现的另一个问题是H2O实体会积累先前的对象,所以我创建了一个函数来删除除主数据之外的所有它们组。 h2o.clean <- function(clust = localH2O, verbose = TRUE, vte = c()){ # Find all objects on server keysToKill <- h2o.ls(clust)$Key # Remove items to be excluded, if any keysToKill <- setdiff(keysToKill, vte) # Loop thru and remove items to be removed for(i in keysToKill){ h2o.rm(object = clust, keys = i) if(verbose == […]

清除或设置null到java中的对象

我最近正在考虑释放Java对象占用的内存。 在这样做时,我对如何在Java中复制(浅/深)对象以及如何避免在对象仍处于使用状态时意外清除/无效而感到困惑。 请考虑以下方案: 将ArrayList作为参数传递给方法。 将ArrayList传递给可由线程处理的可运行类。 将ArrayList放入HashMap 。 现在在这种情况下,如果我调用list = null; 或list.clear(); ,对象会发生什么? 在这种情况下,对象会丢失,在哪种情况下只将引用设置为null? 我想这与浅层和深层复制对象有关,但在哪些情况下会发生浅层复制,在这种情况下,深层复制是否发生在Java中?