Tag: 内存

在java中解析XML的内存效率最高的方法是什么?

我对webapp的内存问题负责解析XML事件并将它们推送到我们的RabbitMQ总线。 这个webapp在servlet中接收XML事件,我们将其解码并将其推送到我们的总线,然后我们确认发送者。 我们正在使用java 5中的org.xml.sax.helpers.DefaultHandler ,但似乎Stax (带有XMLStreamReader)要好得多并且仍然易于阅读,但我们需要将代码迁移到java6(请参阅此问题)所以)。 值得吗? 在java中解析XML的内存效率最高的方法是什么? 我们正在寻找一种快速 , 高效且易于编写/读取的代码。 这存在吗?

内存不一致与线程交错有何不同?

我正在编写一个multithreading程序,正在研究是否应该使用volatile作为我的布尔标志。 关于并发性的文档oracle跟踪并没有解释除了以下内容之外的任何memory consistency errors : 当不同的线程具有应该是相同数据的不一致视图时,会发生内存一致性错误。 假设这些不一致的视图仅在“写入”操作之后发生是有意义的。 但是多久之后呢? 例1 Thread A: Retrieve flag. Thread B: Retrieve flag. Thread A: Negate retrieved value; result is true. Thread A: Store result in flag; flag is now true. Thread B: System.out.print(flag) –> false 由于Thread A和Thread B同时运行,因此打印也可以为true,具体取决于何时检索flag 。 对于不一致而言,这是完全合理的。 但是描述memory consistency errors的方式(写入变量不一定反映在其他线程中)听起来这也是如此: 例2 Thread A: Retrieve flag. Thread A: […]

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 […]

跟踪tomcat webapp中的内存使用情况

是否有任何好的工具可用于跟踪内存使用情况在tomcat java webapp中? 我正在寻找可以按类别或包裹分类的东西。 谢谢,J

为什么我会遇到长时间非GC相关的应用程序暂停?

我一直在GC日志中看到非常长的应用程序暂停,这看起来与垃圾收集无关。 该应用程序在16GB堆上,分配的内存吞吐量非常大。 据我所知,GC日志将显示与GC不一定相关的暂停,这似乎就是这种情况。 此外,在这些暂停期间,CPU达到100%,没有磁盘或内存I / O,并且没有日志记录活动(由于所有应用程序线程都被停止)。 关于可能导致这些长时间停顿的任何想法,或者有关如何跟踪根本原因的任何建议? 以下是日志中的相关片段(请注意151秒暂停): 2015-04-21T06:30:04.834-0500: 217179.483: [GC (Allocation Failure)2015-04-21T06:30:04.849-0500: 217179.483: [ParNew Desired survivor size 43614208 bytes, new threshold 6 (max 6) – age 1: 19876896 bytes, 19876896 total – age 2: 15903904 bytes, 35780800 total – age 3: 617120 bytes, 36397920 total – age 4: 34096 bytes, 36432016 total – age […]

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

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

Java堆越慢越慢

我有一个在(大)图上运行的Java程序。 因此,它使用了大量的堆空间(~50GB,约占主机上物理内存的25%)。 有一次,程序(重复)从图中选择一个节点并用它进行一些计算。 对于某些节点,此计算需要比预期更长的时间(30-60分钟,而不是预期的几秒钟)。 为了分析这些操作以找出需要花费大量时间的内容,我创建了一个测试程序,它只创建大图的一小部分,然后在其中一个节点上运行相同的操作原计划。 因此,与原始程序相比,测试程序显然只使用非常少的堆空间。 事实certificate,在原始程序中花费48分钟的操作可以在测试程序中在9秒内完成。 这真让我困惑。 第一个想法可能是较大的程序花了很多时间在垃圾收集上。 所以我打开了VM垃圾收集器的详细模式。 据此,在48分钟内没有完整的垃圾收集,年轻一代只有大约20个收集,每个收集不到1秒。 所以我的问题是还有什么可以解释时间的巨大差异? 我不太了解Java如何在内部组织堆。 对于具有大量活动对象的大型堆,是否需要更长的时间? 可能是在这样的设置中对象分配需要更长的时间,因为在堆中找到足够的位置需要更长的时间吗? 或者VM是否会对堆进行任何内部重组,这可能需要花费很多时间(显然除了垃圾收集之外)。 我正在使用Oracle JDK 1.7,如果这非常重要的话。

Java和对象,数组和基元类型的精确引用大小

我想知道对象在内存中分配的真实空间。 我尝试用一​​些例子来解释:使用64位JVM,指针大小应该是8个字节,所以: Object singletest = new Object(); 将占用8个字节来引用Object加上Object的大小 Object arraytest = new Object[10]; 将需要8个字节来引用存储数组的位置加上8 * 10个字节来存储数组加上每个Object的大小 int singleint = new int; 将只占用2个字节,因为int是基本类型 int[] arrayint = new int[10]; 将占用8个字节来引用位置,并使用10 * 2个字节作为元素 而且,这就是为什么Java允许编写这样的代码的原因: int[][] doublearray = new int[2][]; int[0][] = new int[5]; int[1][] = new int[10]; 真正发生的是数组会像对象一样产生一个引用(也就是指针),所以在声明时它并不重要第二维的大小(维度可能不同,它们之间没有链接)。 然后所采用的空间将是:对doublearray (8字节)的引用,第一维只是对第二维的引用,所以其他8字节* 2(第一维尺寸),最后是2字节* 5加2字节* 10 。 所以,最后,如果有一个像这样的真正的类: class Test { […]

在调用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()方法时减少内存使用/对象创建 ?