Tag: 内存

如何处理大字符串和有限的内存

我有一个文件,我从中读取数据。 此文件中的所有文本都存储在String变量(一个非常大的变量)中。 然后在我的应用程序的另一部分,我想要遍历此字符串并逐步提取有用的信息(解析字符串)。 与此同时,我的内存已满,OutOfMemoryexception使我无法进一步处理。 我认为在从文件中读取输入流时直接处理数据会更好。 但是对于组织目标,我想将String传递给我的应用程序中的另一部分。 我该怎么做才能防止内存溢出?

在Java中创建对象时会发生什么?

我的老师给了我一个问题: “在Java中创建对象时会发生什么”。 据我所知,在创建对象时会发生内存分配,变量初始化和构造函数方法调用。 但我的老师说我几乎是对的。 除了内存堆之外,后来的两件事情是正确的。 相反,他说内存分配发生了。 我认为该对象存储在堆中,所以我的老师错了。 你这么认为吗?

如何缩小java堆空间?

我有一个Java控制台应用程序,它使用DOM处理大型xml文件。 基本上它从数据库中获取的数据创建xml文件。 现在,正如你猜测它正在使用大量内存,但令我惊讶的是,它与糟糕的代码无关,而是与“java堆空间不缩小”有关。 我尝试使用这些JVM参数从Eclipse运行我的应用程序: -Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 我甚至加了 -XX:-UseSerialGC 因为我发现并行GC忽略“MinHeap”和“MaxHeap”选项。 即使有所有这些选项我的应用程序的内存使用图形看起来像这样: 正如您所看到的,我的应用程序在某一时刻需要大约400 MB的堆空间,堆增长到大约650 MB,但几秒钟之后(当xml生成完成时)我的应用程序下降到12MB的已用堆,但是“堆大小” “保持在650 MB左右。 我的RAM需要650 MB! 这是古怪的,你不觉得吗? **有没有办法强制JVS缩小可用堆大小,比如当前使用堆的150%?**就像,如果我的应用程序需要15 MB内存,堆大小约为20MB,当我的应用程序要求400 MB时在我的应用程序完成繁重的操作后,ram,堆增长到~600 MB并且DROPS回到~20 MB?

JVM内存:为什么任务管理器上的内存与JProbe(或JConsole工具)不同

我遇到的问题是我的应用程序使用的内存只有100MB,之后它减少了50MB,但是在Window Task Manager上显示150MB并且始终保持或增加但不减少,我们如何减少任务管理器上的内存(私有工作集)?

为什么说Java的字符串内存使用率很高?

在这篇博客文章中 ,据说String的最小内存使用量是: 8 * (int) ((((no chars) * 2) + 45) / 8)字节。 因此对于字符串“Apple Computers”,最小内存使用量为72字节。 即使我有10,000个长度为两倍的String对象,内存使用量也会小于2Mb,这根本不算多少。 那么这是否意味着我低估了企业应用程序中存在的字符串数量,或者该公式是错误的? 谢谢

Java 8 Stream与集合存储

我一直在阅读Java 8 Streams以及从数据源流式传输数据的方式,而不是让整个集合从中提取数据。 特别是我引用了一篇关于Java 8中的流的文章。 “没有存储。流没有值存储;它们通过一系列计算步骤从源(可能是数据结构,生成函数,I / O通道等)传输值。” 来自: http : //www.drdobbs.com/jvm/lambdas-and-streams-in-java-8-libraries/240166818?pgno = 1 我理解从一个源一步一步地流式传输数据的概念。 我不明白的是,如果你是从一个集合流式传输,怎么没有存储? 该集合已存在于Heap中,您只是从该集合中流式传输数据,该集合已存在于“存储”中。 如果我只是通过标准for循环遍历集合,那么内存占用的区别是什么?

Java进程内存无限增长。 内存泄漏?

我们在Solaris 10上运行了一个java进程,为大约200-300个并发用户提供服务。 管理员报告说,进程使用的内存会随着时间的推移而显着增加。 它在几天内达到2GB并且永远不会停止增长。 我们已经使用Eclipse Memory Profiler转储堆并对其进行了分析,但是在那里看不到任何exception。 堆大小非常小。 添加内存统计日志记录后,我们发现在应用程序中,“管理员使用的”top“实用程序报告的内存使用量与MemoryMXBean和Runtime库报告的使用情况之间存在差异。 这是两者的输出。 Memory usage information From the Runtime library Free memory: 381MB Allocated memory: 74MB Max memory: 456MB Total free memory: 381MB From the MemoryMXBean library. Heap Committed: 136MB Heap Init: 64MB Heap Used: 74MB Heap Max: 456MB Non Heap Committed: 73MB Non Heap Init: 4MB Non […]

Java堆大小未完全使用

我正在使用Visual VM监视我正在运行的java应用程序: http : //visualvm.java.net/ 我用-Xmx128m强调内存使用量。 运行时我看到堆大小增加到128m(正如预期的那样)但是在遇到java堆空间错误之前,使用的堆收敛到大约105m。 为什么这些剩下20米,没用过?

在内存中创建一个Zip文件

我正在尝试压缩文件(例如foo.csv)并将其上传到服务器。 我有一个工作版本,它创建一个本地副本,然后删除本地副本。 我如何压缩文件,以便在不写入硬盘的情况下将其发送到纯粹的内存中?

如何用C#测量内存使用量(我们可以用Java做)?

我试图在C#程序中测量内存使用情况。 我想知道这个Java函数的C#等价物: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 表示为堆分配的总内存。 我需要知道为C#programm分配的内存总大小。 然后在Java中我可以获得用过的内存: ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 目前我在C#中使用它来获取已用内存: Process_Memory = MyProcess.PrivateMemorySize64; 但我并不完全确定它是等同的。 那么在简历中如何获得我的C#应用​​程序的总分配空间以及当前t的当前使用? 编辑: 从答案和进一步研究中我确定了这个: 当前使用的内存 System.GC.GetTotalMemory(false); 给出当前在托管内存中分配的字节数。 ( http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx ) 这个方法返回一个低值,我很确定它并不是所有正在使用的内存的表示,因为我可以使用Java中的 getUsed() 。 在java中,对于相同的应用程序,使用的内存从5MB开始,最大为125MB。 使用C#,我使用上述方法从1到5 MB。 看起来 : MyProcess.PrivateMemorySize64; // return ~=25MB 要么 MyProcess.WorkingSet64; //return ~=20MB 为所有正在使用的内存提供更准确的值。 但我不知道应该使用哪一个…… 对于全局分配的内存, 本文建议使用: Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 它在程序中总是返回相同的值 ,大约169MB,与Java相比看起来很公平:从64MB到170MB最大 我仍然在寻找一个准确的答案,我发现它非常含糊,而且我对Windows内存管理不是很熟悉,我真的不确定我发现的文档:/