Tag: 内存管理

Tomcat内存使用情况(PermGen)

我正在使用Tomcat来部署具有以下PermGen配置的Web应用程序: JAVA_OPTS=”-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC” 我想知道以下内容: Tomcat使用的整个内存应该是256MB还是Tomcat因其他原因而占用其他内存? 如何监视Tomcat使用的内存以避免达到PemGen max size? 另外请注意,我有3个拥有相同PermGen配置的Tomcats,运行在8 GB Ram的同一物理服务器上,这让我害怕将PermGen max size增加到512MB而不影响物理服务器内存。

Java Runtime.getRuntime()。freeMemory()问题

我搜索并看到了一些线程,但没有一个解决我遇到的具体问题。 我试图使用Runtime.getRuntime().freeMemory() , Runtime.getRuntime().maxMemory()和Runtime.getRuntime().totalMemory() Runtime.getRuntime().maxMemory()来监视我的内存使用情况。 在一次运行中,它表示在声明一个数组之前有2245273792个空闲字节,但程序在内存耗尽并且在尝试声明一个1104674816字节的数组时崩溃: Free memory (bytes): 2245273792 Maximum memory (bytes): 6710886400 Total memory available to JVM (bytes): 5606211584 OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000728280000, 1104674816, 0) failed; error=’Cannot allocate memory’ (errno=12) There is insufficient memory for the Java Runtime Environment to continue. Native memory allocation (malloc) failed to allocate 1104674816 bytes […]

当已经指定了最大堆值时,是否有解决“Java堆空间”内存错误的解决方法?

我正在运行一个WEKA分类器(J48,输入.arff文件由3个字段组成,字段1具有~27k个不同属性,字段2~500k值),最新一代Macbook Pro具有8GB RAM。 我使用-Xmx参数将java堆空间增加到最大值: java -Xmx7G -cp weka-3-6-10 / weka.jar weka.classifiers.trees.J48 -t myfiles / loc_linear.arff -i 但是当我运行分类器(大约10分钟后)后,我得到错误“ 线程中的exception”主“java.lang.OutOfMemoryError:Java堆空间 ”。 显然我的输入文件8GB RAM是不够的。 这是否意味着唯一的解决方案是拥有更强大的硬件(例如16GB RAM或非常强大的服务器/集群)? 这个问题会有解决方法吗? (例如,减少输入文件?如果是这样,您认为哪种标准适用于减少?)。 还有其他想法或建议吗?

如何清除对象(HashMap)进行垃圾收集 – Java

所以我在这里有一个java程序,它操纵大量数据并将其存储到对象中(主要是哈希映射)。 在运行时的某个时刻,数据变得无用,我需要丢弃,这样我就可以释放一些内存。 我的问题是丢弃这些数据被垃圾收集的最佳行为是什么? 我已经尝试过map.clear(),但是这还不足以清除地图分配的内存。 编辑 (添加我尝试的替代品) 我也尝试过system.gc()来强制垃圾收集器运行,但它没有帮助

在调用intern()方法后,内存中的新String()对象何时清除

List list = new ArrayList(); for (int i = 0; i < 1000; i++) { StringBuilder sb = new StringBuilder(); String string = sb.toString(); string = string.intern() list.add(string); } 在上面的示例中,在调用string.intern()方法之后,何时清除在堆(sb.toString)中创建的1000个对象? 编辑1:如果无法保证可以清除这些对象。 假设GC没有运行,使用string.intern()本身是否过时了? (在内存使用方面?) 有没有办法在使用intern()方法时减少内存使用/对象创建 ?

finalize()如何在java中工作?

所以,我最近在Java中发现了finalize方法(不知道为什么我之前错过了它,但它确实存在)。 这似乎可能是我正在处理的许多问题的答案,但我想首先获得更多信息。 在线,我发现这个图表说明了垃圾收集和完成的过程: 几个问题: 这发生在一个单独的线程中,对吗? 如果我在finalize期间实例化一个新对象会发生什么? 这是允许的吗? 如果我从finalize调用静态方法会发生什么? 如果我在finalize中建立对象的新引用会发生什么? 我想我应该解释为什么我感兴趣。 我经常使用LWJGL,似乎如果我可以使用finalize来使Java对象自动清理OpenGL资源,那么我可以在API方面做一些非常好的事情。

Java在哪里做局部变量,对象引用,实例变量

我目前正在学习java,堆栈和堆的内存概念,我知道局部变量和方法调用都存在于一个叫做堆栈的地方。 和对象住在堆里面。 但是如果该局部变量包含一个对象呢? 或者有对象参考? public void Something(){ Duck d = new Duck(24); } 它仍然存在于堆栈中吗? 实例变量在哪里? 请尽量保持简单。 谢谢。

GC中的GC.AddMemoryPressure等效

项目:Java,JNI(C ++),Android。 我将通过创建一个托管包装类来管理本机C ++对象的生命周期,该类包含一个指向本机对象的指针(作为一个长成员),并将删除其中重写的finalize()方法中的本机对象。 有关详细信息,请参阅此问 C ++对象不消耗其他类型的资源,只消耗内存。 对象的内存占用量不是很高,但它基本上高于Java中64位的长度。 有没有办法告诉Java的GC,我的包装器不仅仅是一个很长的值,而且在运行垃圾收集之前创建数百万个这样的对象并不是一个好主意? 在.NET中有一个GC的AddMemoryPressure ()方法,正是出于这个目的。 Java中是否存在等价物?

我的Bitset的大小是多少?

我想以尽可能小的空间将System.currentTimeInMillis存储在内存中。 因为我必须将数百万存储在内存中。 我将它转换为binaryString ,它给了我41 bits 这是我的计划 public class BitSetSize { public static void main(final String[] args) { final long currentTimeMillis = System.currentTimeMillis(); final String currentTimeToBinaryString = Long.toBinaryString(currentTimeMillis); System.out.println(“Size in bits: ” + currentTimeToBinaryString.length()); final BitSet bitSet = BitSet.valueOf(new long[]{currentTimeMillis}); System.out.println(“Bitset length: ” + bitSet.length()); System.out.println(“Bitset size: ” + bitSet.size()); System.out.println(“Size of biset object(bytes): ” + […]

我应该使用哪个Java集合来实现线程安全缓存?

我希望实现一个简单的缓存,而不需要做太多的工作(当然)。 在我看来,其中一个标准的Java集合应该足够了,只需要一些额外的工作。 具体来说,我正在存储来自服务器的响应,密钥可以是请求URL字符串,也可以是从URL生成的哈希码。 我原本以为我可以使用WeakHashMap ,但看起来这种方法迫使我管理我想要保留的对象,而且我没有用强引用管理的任何对象都会立即被扫除。 我应该尝试一下SoftReference值的ConcurrentHashMap吗? 或者那些也会被积极地清理干净? 我现在正在查看LinkedHashMap类。 通过一些修改,它看起来很有希望用于MRU缓存。 还有其他建议吗? 无论我使用哪个集合,我应该尝试手动修剪LRU值,还是可以信任VM偏向回收最近访问的对象? 仅供参考,我正在开发Android,所以我不想导入任何第三方库。 我正在处理一个非常小的堆(16到24 MB),因此VM可能非常渴望回收资源。 我认为GC会很有侵略性。