无法理解Intellij IDEA的内存使用和管理 - java

几年以来,我再次与IDEA合作,到目前为止我很高兴。
问题只是我在处理项目时出现奇怪的内存使用行为和GC操作,这导致我的IDE在GC工作时冻结了几秒钟。
无论我正在从事多大的项目,几天后,内存使用量都会增加到500 MB(我的堆空间最大为512 MB,实际上,我认为,它对于具有大约100 Java的Web项目来说已经足够了文件)。 GC完成工作后,我得到了400 MB的使用空间-未收集-仅有大约100 MB的空闲堆空间,几分钟后内存使用量又增加了,堆又变满了。

JVM version is 19.0-b09

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 536870912 (512.0MB)
   NewSize          = 178257920 (170.0MB)
   MaxNewSize       = 178257920 (170.0MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 16777216 (16.0MB)
   MaxPermSize      = 314572800 (300.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 145489920 (138.75MB)
   used     = 81242600 (77.4789810180664MB)
   free     = 64247320 (61.271018981933594MB)
   55.84070704004786% used
From Space:
   capacity = 16384000 (15.625MB)
   used     = 0 (0.0MB)
   free     = 16384000 (15.625MB)
   0.0% used
To Space:
   capacity = 16384000 (15.625MB)
   used     = 0 (0.0MB)
   free     = 16384000 (15.625MB)
   0.0% used
PS Old Generation
   capacity = 358612992 (342.0MB)
   used     = 358612992 (342.0MB)
   free     = 0 (0.0MB)
   100.0% used
PS Perm Generation
   capacity = 172621824 (164.625MB)
   used     = 172385280 (164.3994140625MB)
   free     = 236544 (0.2255859375MB)
   99.86296981776765% used

这就是我的堆空间的样子。值得注意的是,老一代和彼尔姆一代约占其空间的100%。但是我几次手动触发了GC。问题是,如何在不启动IDE的情况下使IDE清除旧对象中的这些对象? (启动后,内存使用量约为60MB -90 MB)我如何找出这些内容?有一些正在运行的线程可以在VisualVM中监视,例如RMI TCP连接,RMI TCP接受,XML RPC Weblistener等,尽管我在IDE上不执行任何操作,并且它们仍然消耗内存,甚至每秒5-10 MB。

$ uname -a
Linux bagdemir 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 21:21:01 UTC 2011 i686 GNU/Linux

$ java --version 
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Server VM (build 19.1-b02, mixed mode)

更新:
内存配置:
-Xms256m -Xmx512m -Xmn170m -XX:MaxPermSize = 300m

参考方案

正确的方法是获取memory snapshot并向带有附有快照的JetBrains跟踪器提交相应的票证。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…