Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java内存性能-奇怪的行为(或者这是正常的?)_Java_Runtime_Heap_Memory Management - Fatal编程技术网

java内存性能-奇怪的行为(或者这是正常的?)

java内存性能-奇怪的行为(或者这是正常的?),java,runtime,heap,memory-management,Java,Runtime,Heap,Memory Management,你好 我想首先说我是一个初学者,但我正在开发一个非常小和简单的Java应用程序,它不应该引起一些大问题。 我从windows任务管理器监视内存使用情况,注意到应用程序启动后,java.exe使用了大约70MB的可用内存。所以我想,好吧,这可能有点大,但仍然没有什么是我的电脑无法处理的。但当我尝试调整窗口大小时,发生了一件非常奇怪的事情,内存使用量突然上升到80-90MB,如果我继续拖动窗口,随机调整大小,内存使用量就会不断增加。我认为这与在调整窗口大小期间调用GUI组件上的重新绘制方法有关,因此

你好 我想首先说我是一个初学者,但我正在开发一个非常小和简单的Java应用程序,它不应该引起一些大问题。 我从windows任务管理器监视内存使用情况,注意到应用程序启动后,java.exe使用了大约70MB的可用内存。所以我想,好吧,这可能有点大,但仍然没有什么是我的电脑无法处理的。但当我尝试调整窗口大小时,发生了一件非常奇怪的事情,内存使用量突然上升到80-90MB,如果我继续拖动窗口,随机调整大小,内存使用量就会不断增加。我认为这与在调整窗口大小期间调用GUI组件上的重新绘制方法有关,因此我使用了一些可能导致某种内存泄漏的可疑组件,并从主窗口窗体中删除了这些组件,使我的程序几乎完全剥离,但这个问题仍然存在。我后来注意到,如果我继续调整窗口大小,内存使用量将增长到200-220MB,然后停止这种不受控制的增长。
那么,有人能告诉我,在java中考虑内存管理时,这是一种正常的行为吗?

创建的java对象在完成后不一定会被清除。相反,称为“垃圾收集器”的东西定期在后台运行,查找孤立对象并删除它们,从而释放内存

应用程序在调整窗口大小时可能会创建大量临时对象。虽然不再被任何对象引用(即孤立对象),但这些对象将一直挂起,直到垃圾收集器运行为止

您可能会发现您的最大内存是256M(默认值)——当您接近最大内存时,可能会更频繁地调用垃圾收集器,并且创建新对象需要立即释放内存——因此,由于创建/删除速率与需求平衡,内存徘徊在256M以下


这是完全正常的行为。

不,这是完全正常的行为。Java内存管理基于自动垃圾收集,这意味着未使用的内存在被垃圾收集之前会积累一段时间(因为这是一项相当大的工作,所以您希望尽可能少地这样做)

因此JVM将倾向于使用允许使用的大部分内存(最大堆大小)-在具有多GB可用内存的现代PC上,默认最大堆大小将相当大。但是,如果您有一个小应用程序,您知道它不需要太多内存,您可以通过命令行选项调整最大堆大小,例如,Xmx

java -Xmx64M main.class.name

将堆限制在64MB

哇,非常感谢你们的快速回答,非常感谢。我要说的是,我真的了解了java的所有基本概念,包括垃圾收集原理,只是我在开发java应用程序方面没有那么多经验,所以我没有“感觉”我想我可以在某个时候强制垃圾收集,但我认为这不是一个真正的问题,我只是认为GC以更频繁的方式运行。我想如果一切都按它应该的方式进行,我最终会对堆设置一个限制。@Kani:垃圾收集确实更频繁,但还有另一个er因素:它释放的内存不会立即作为空闲内存返回操作系统。JVM会保留它自己,以防不久再次需要它(因为从操作系统获取内存也是一个相对昂贵的操作)。这种行为可以与其他行为一起调整(不太知名)命令行开关。是的,这很有意义。在谷歌搜索内存泄漏问题之前,我真的应该多读一点关于垃圾收集的原理:D