Tag: 内存

JVisualVM可以“堆转储”按钮释放内存吗?

我有一个非常奇怪的问题。 我正在开发一个基于Eclipse Equinox的OSGi应用程序; 它是使用OSGi Log Service(Equinox实现)开发的,现在我正在使用Apache Felix OSGi Log Service实现进行测试。 在API /代码方面,一切正常:OSGi日志服务是标准的,所以我可以毫无问题地从Equinox交换到Felix。 但是,我观察到了这种奇怪的行为:我将应用程序作为控制台程序启动,在控制台上查看日志输出,并将JVisualVM连接到它以分析内存使用情况; JVisualVM图显示了一个80 MB的堆。 13个小时后,平均堆大小达到220 MB,所以我决定分析堆转储,并按下“堆转储”按钮:在此操作之后,JVisualVM图显示使用的堆为20(min)-35 (最大)MB(?!?!),这个值是常数。 “堆转储”操作可以释放近200 mbs吗? 如果是,为什么? 我从未在Equinox OSGi Log Service实现中看到这种行为,所以我怀疑Felix Log涉及这个问题…… 谢谢

java用完了内存问题

我有一个运行在带有linux 64bit操作系统的amazon-ec2-m1.large实例上的jar文件。 我在不同时间之后耗尽内存,通常在2-4之间,尽管在我的上一次日志写入(在创建错误文件之前),我看到以下内容: Memory – totalHeapSize: 264 MB, maxHeapSize: 1656 MB, freeHeapSize: 220 MB 当我从jar开始看到内存耗尽 – 所有值都相同,freeHeapSize介于200-230 MB之间(我每隔30秒检查一次,并执行System.gc()) 在hs_err_pid2250.log中写道: # # There is insufficient memory for the Java Runtime Environment to continue. # Cannot create GC thread. Out of system resources. # Possible reasons: # The system is out of physical RAM or swap space […]

Java中序列化对象大小与内存对象大小的比较

有没有一种方法可以从Java中的序列化对象大小估计(大致)内存对象大小

Java程序可以检测到它在堆空间上运行不足吗?

我会在我的室友的电脑上运行一个遗传算法整个周末,我担心它会在这么长时间内耗尽内存。 但是,我的算法以这样的方式工作,这样可以很容易地减少不太有用的结果,所以如果有办法告诉我的程序什么时候用完堆空间,我可能会腾出空间继续前进多一点时间。 在OutOfMemoryError之前,有没有办法在JVM用尽堆空间时收到通知?

如何在Java中找到物理内存大小?

我正在编写一个安装程序,它将调整产品的配置,以用于运行它的特定硬件。 特别是,我想确定系统中安装了多少物理RAM,以便估计在运行时为产品分配多少内存。 理想情况下,我想以独立于平台的纯Java方式执行此操作,因为安装程序需要在几个不同的平台上运行,但如果不可能,则首选Windows解决方案,因为这是最常见的部署平台。 在这种情况下,可以安全地假设产品将是盒子上运行的唯一/主要应用程序,因此我不必担心挤压其他任何人。 我不想过度分配,因为根据我们的经验,这可能会损害性能。

Java中String的内存使用情况

我在Java中有一个包含String的对象。 我很好奇String的内存使用情况如何。 我正在尝试优化我的程序的内存使用量,应用程序将有大约10000个这样的对象。 对于诸如“Hello World”之类的字符串,内存使用量是多少?

Java最终字段的值的’最新’保证是否延伸到间接引用?

Java语言规范定义了第17.5节中最终字段的语义: 最终字段的使用模型很简单。 在该对象的构造函数中设置对象的最终字段。 在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。 它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的。 我的问题是 – ‘最新’保证是否扩展到嵌套数组和嵌套对象的内容? 简而言之:如果一个线程将可变对象图分配给对象中的最终字段,并且对象图永远不会更新,那么所有线程都可以通过最终字段安全地读取该对象图吗? 示例场景: 线程A构造一个ArrayLists的HashMap,然后在类’MyClass’的实例中将HashMap分配给final字段’myFinal’ 线程B看到对MyClass实例的(非同步)引用并读取’myFinal’,并访问和读取其中一个ArrayLists的内容 在这种情况下,线程B看到的ArrayList的成员是否保证至少与MyClass的构造函数完成时一样最新? 我正在寻找澄清Java内存模型和语言规范的语义,而不是像同步这样的替代解决方案。 我的梦想答案是肯定或否定,并参考相关文字。 更新: 我对Java 1.5及更高版本的语义感兴趣,即通过JSR 133引入更新的Java内存模型。此更新中引入了最终字段的“最新”保证。

分配和创建字符串实例之间有什么区别?

在一次采访问题中,采访者问我 以下陈述之间的共同点和区别是什么: String s = “Test”; String s = new String(“Test”); 内存分配有什么不同吗?

无法为Java分配足够的堆空间

我们有一个运行良好一年的应用程序。 它是一个Web应用程序,在Windows Server 2003 Enterprise Edition Service Pack 2下的Microsoft Cluster下的Tomcat 5.5 + JDK 1.5下运行。服务器有11Gb的RAM(我知道它没用!),其中包含以下描述“物理地址扩展” :我不知道这意味着什么。 Tomcat服务配置了以下参数: -Xmx1024m -Xms128m 从上周开始,该服务不再需要启动并停止,并显示以下错误消息:“无法分配足够的堆空间”。 我们尝试了几个测试: java -Xmx1024m -version =>失败 java -Xmx758m -version =>失败 java -Xmx512m -version =>通过 因此,我们可以使用更少的内存来获得最大堆大小,但这不是一个可接受的解决方法,因为用户数量将在几个月内增加,我们需要将最大堆大小设置为1024Mb。 另外我不明白为什么它工作正常然后突然停止工作! 似乎操作系统现在无法分配连续内存或其他内容(页面文件大小,用户内存分配……) 由于Web应用程序在客户服务器上运行而我们无法访问它,因此很难知道某些内容是否发生了变化(操作系统补丁,配置等)。

Byte 和java.lang.OutOfMemoryError按位读取文件

我正在尝试编写一个按位读取文件的阅读器,但我对大文件有问题。 我尝试用100 mb读取文件,花了3分钟但它确实有效。 然而,然后我尝试了500 MB的文件,但它甚至没有开始。 因为这条线: byte[] fileBits = new byte[len]; 现在我正在寻找苏打,找不到任何东西。 也许有人解决了它,可以分享一些代码,提示或想法。 if (file.length() > Integer.MAX_VALUE) { throw new IllegalArgumentException(“File is too large: ” + file.length()); } int len = (int) file.length(); FileInputStream inputStream = new FileInputStream(file); try { byte[] fileBits = new byte[len]; for (int pos = 0; pos < len;) { int […]