Tag: 堆内存

JVM内存中特定对象的子树的大小

是否可以以编程方式检查一些对象占用多少内存(使用JVM内存中的整个子树)。 我想说(来自java代码) “当我们假设提到的JPanel是这棵树的根”时,告诉我当前JVM中有多少内存将JPanel带到整个引用子树。 我想知道我是否可以通过这种方式比较两个JPanels(或JFrame或其他)需要多少内存,而且需要更多内存 – 而不分析转储。 而且我想知道答案是肯定的,这个值有多精确。

在命令行上增加jMeter的内存

我在Mac上从命令行运行jMeter。 今天它抛出了内存不足,堆空间错误…. newbie$ sh jmeter.sh Exception in thread “AWT-EventQueue-0″ java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferInt.(DataBufferInt.java:41) at java.awt.image.Raster.createPackedRaster(Raster.java:455) 我知道我需要增加分配给它的内存,但不知道如何。 我查看了这篇文章无法在Mac OSX上增加JMeter的堆大小 ,发现它提到的bin文件夹中的jMeter脚本文件并进行了以下更新。 HEAP=”-Xms1024m -Xmx2048m” NEW=”-XX:NewSize=512m -XX:MaxNewSize=1024m” 但我仍然得到内存不足的错误。 我只是需要更多还是我在错误的地方改变? 难道我需要重新启动整台机器吗?

google common cache – maximumSize的默认值(和其他“可选”设置) – 想要一个使用所有“可用”内存的缓存

我刚刚通过搜索缓存API找到了Guava (它非常适合我的需求)。 但是在阅读wiki和Javadoc时出现了一个问题 – CacheBuilder可以采用什么设置的默认值? Javadoc声明“这些function都是可选的”和“使用默认设置构造一个新的CacheBuilder实例,包括强键,强值,并且不会自动驱逐任何类型。” 在我看来, maximumSize一个很好的默认值是相对于Runtime.getRuntime().freeMemory(); 最后,我想要一个使用给定系统上可用内存的缓存。 所以我需要一个驱逐策略,询问freeMemory()有多少可用(可能相对于Runtime.getRuntime().maxMemory() )

Java:方法挂钩和查找对象实例

情况 嗨,我有2个问题。 情况是我正在为Windows编写Java API ,它还提供了将代码注入进程然后操作目标的工具。 我已经实现了注射部件 ,例如将一个jar子注入另一个jar子里。 此时我的jar被调用(目标已经在运行时),并在完整的静态上下文中启动。 目标和问题 从这里我有两个目标: 我想与目标对象进行交互 ,因此我需要引用 。 对于许多对象,这已经成为可能,因为它们提供对其实例的静态访问。 例如, awt.Frames #getFrames()提供对所有创建的Frame对象的访问。 但如果有可能访问堆上的任意对象 ,那将是非常棒的。 像’ Heap#getAllObjectInstances() ‘之类的东西。 给定一个对象实例,我想连接到这个对象的任意函数 。 例如,每当调用BufferStrategy#show()时,我希望它首先调用另一个方法。 所以我总结了以下问题: 如何从静态上下文中获取任意对象引用? 如何连接到任意函数? 备注 到目前为止我所做的,评论和想法: JDI (Java调试器接口)通过VirtualMachine#allClasses() – > ReferenceType#instances(0)提供这样的方法。 但是JDI需要使用额外的调试参数来启动目标JVM ,这对我来说是没有选择的 。 可以使用内存工具进行低级分析并分析堆,但我希望有人知道更高级的方法 。 使用Windows API对我来说是一个选项,因为我熟悉JNA / JNI ,但我不知道这样的工具。 最后一种方法是使用IAT挂钩 C-Code,这是一种非常低级的方法,我想避免这种情况 。 我可以假设此时有一个对象引用,也许Reflection API提供了一种更改对象方​​法的方法? 或者至少简单地提供挂钩机制? 请注意,更改目标代码当然不适合我。 并且它已经在运行时,因此ByteCode-Manipulation也可以是一个选项。 脚本 这会派上用场: […]

java.lang.OutOfMemoryError:将13k .png图像拼接在一起时的Java堆空间

我有13255个图像,每个240 x 240像素宽,最大的15,412字节大小和最小的839字节。 我试图循环文件夹将每个文件添加到File []。 一旦我有一个每个图像的数组,然后我将它们放在BufferedImage []中,准备好循环并绘制到由每个图像组成的更大的单个图像上。 每个图像都以。的forms命名 Image xy.png 但是,我一直以java.lang.OutOfMemoryError:Java堆空间错误结束。 我不知道为什么。 我已经尝试通过向Eclipse的目标末尾添加参数来更改JVM可用内存的大小。 以下是我用过的内容: IDE’s\eclipse-jee-juno-SR2-win32-x86_64\eclipse\eclipse.exe -vmargs -Xms64m -Xmx1024m 和 IDE’s\eclipse-jee-juno-SR2-win32-x86_64\eclipse\eclipse.exe -vmargs -Xms64m -Xmx4096m 两者都没有效果。 我也进入了控制面板 – >程序 – > Java,并改变了那里可用的内存量。 这是我写的方法: public static void merge_images() throws IOException { int rows = 115; int cols = 115; int chunks = rows * cols; System.out.println(chunks); int chunkWidth, […]

字符串a ==字符串b 的规则

我试图理解字符串池的工作原理以及字符串与另一个字符串相等的规则。 例如这个片段: public static void main(String[] hi){ String s1 = “lol”; String s2 = “lol”; String s3 = new String(“lol”); System.out.println( s1 == s2 );// true System.out.println( s2 == s3); // false s3.intern(); //line 1 System.out.println( s1 == s3); // false testString(s1); } private static void testString(String s1){ String s4 = “lol”; System.out.println( s1 == […]

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

JVisualVM / JConsole中的System.gc()vs GC按钮

我目前正在测试我的概念certificate原型处理XML模式,并围绕一个非常耗费内存的外部库构建树自动机(我已经获得了源代码),我想绘制“真正的峰值”(堆) )随着模式大小的增加,不同运行的内存消耗(使用的度量标准适合我的purpouse并且不影响问题),或者至少是它的合理近似值。 为了给出一个数量级,对于一个真正的峰值为100MB的运行(我测试它运行几次完全相同的输入/参数配置,强制jvm内存-Xmx和-Xms减少值,我得到Exception in线程“main”java.lang.OutOfMemoryError:GC开销限制超过 <100MB,具有稳定且可重复的结果)它占用大约1.1GB,这就是为什么获取实数非常重要,因为它们差别很大! 我花了最近10天在网上和stackoverflow中阅读问题,我实际知道的是: System.gc()“建议”GC运行,不以任何方式强制它,因此不可能依赖它来检测内存使用峰值 通常建议的是计算对象占用(我看到了SizeOf项目,我尝试并且工作正常,即使它不符合我的需要),这对我来说是不可行的,因为由于创建了大量的内存分配很多收集(设置,列表和映射)迭代器在不同的方法中,被称为非常多次(对于我记忆中的10分钟,每个数百万次),因此检测所有涉及的对象将非常困难并执行总和(我用内存消耗图调试了很多次运行而不能只识别一个瓶颈) 没有办法轻易获得方法的内存占用(表示为对象内存分配的峰值) 事实上,我自己经历过System.gc()调用不可靠(例如,由于GC真的被调用而在System.gc()之后读取不同的内存),但是当我按下JVisualVM或Jconsole中的“GC按钮”它永远不会运行GC或拒绝这样做。 所以我的问题是:调用它们的按钮实现(我还没有尝试过,但是对于我现在所读到的,使用带有attach api的 jconsole.jar似乎是可行的)将不同于直接调用System.gc()从我的代码,从而解决我的问题? 如果没有,你如何解释该按钮的“确定性行为”? 到目前为止,我对10个增加的模式大小进行了实际内存峰值的手动测试(对于这种测量,模式是从单个“复杂度参数”自动生成的)并且我绘制了预期曲线,如果我将无法获得一个更好的解决方案我想将我的代码作为外部jar运行,其中-Xmx / -Xms等于略低于我对预期内存峰值的预测,捕获外部进程ErrorStream中的OutMemoryException并重新启动增加的内存直到完成运行已完成。 (如果天真的记忆预测不够健壮,我将应用适当的机器学习技术)。 我知道这不是一个优雅的解决方案,但在我的情况下(学术界)我可以花费一些额外的时间来进行这些测量。 如果您对此powershell方法有其他建议或改进,欢迎(非常)欢迎您分享。 系统信息(机器是Fedora 17,64位): java版“1.7.0_04”Java(TM)SE运行时环境(版本1.7.0_04-b20)Java HotSpot(TM)64位服务器VM(版本23.0-b21,混合模式) 在此先感谢,亚历山德罗

为什么JVM堆不断增长?

我编写了一个简单的程序并使用jconsole.exe来监视其堆大小。 public class HeapTest { public static void main(String[] args) { while(true) { } } } 这是结果 我不明白为什么堆大小不断增长。 我的程序中没有new()任何Object。 我的程序中使用的堆是什么? 我没有向jconsole.exe添加任何其他参数; 只需双击它,然后根据PID加载java进程。 环境:Windows 7下的Java 1.8.0_25

用完堆空间

我有堆空间问题。 我的程序很简单。 有两个actor(发送和接收)“发送”actor每秒传递10000个对象来“接收”,并接收发布这些对象。 接收器接收的对象被保存在容器中,但容器每秒都被清空。 因此容器没有空间耗尽。 现在在420000个对象后,我的eclipse鞋出现了一个错误,说“ ioconsole updater遇到了问题” 。 当我转到细节时,我看到错误内部错误:: Java堆空间 我试过增加堆大小。 我的堆大小是8096米,maxpermsize是4096 我正在使用visualVm监视我的代码,我注意到它没有超过堆大小。 如何解决问题完全空白。 有人可以让我知道其他可能的情况会导致这样的错误。