背景介绍
用java swing(jdk 1.7.0_71)开发了一款类似于windows explorer的桌面产品,除了文件管理等常用的功能外,还附带了标签(TAG)管理功能,也就是对文件或者文件夹指定标签,根据标签对文件进行管理.
遇到的问题
应用中有一个根据关键字进行文件查找的功能,查找本身并没有什么问题,只是对符合查找条件的文件或者文件夹进行画面显示的时候,遇到了jvm内存爆满的问题.因为测试了一种极端的情况,查找C盘下的所有带a关键字的文件和文件夹,因为结果集特别大,所以画面显示的时候遭遇了JVM内存储爆满.
原因分析
结果集显示的时候,其实就是往JPanel里面不断地add新的文件JPanel,一个文件JPanel里面至少有两个JLabel,一个用来显示图标,另一个显示文件名,所有的这些对象都在不断地向JVM堆里面涌动,而且这些对象在切换到别的画面之前,都不会被JVM回收.这样就造成了JVM内存储爆满.
整个过程如下:
1>缺省配置启动java,最大堆内存为247.5M,这个数值是绝对不够用的
因为
NewRatio=2 default
SurvivorRatio=8 default
所以
Eden space=64M
Survivor space=8M
Tenured gen=175.5M
最终结果如下:
Console报错:
Exception in thread "RMI TCP Connection(idle)" Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "JMX server connection timeout 23" java.lang.OutOfMemoryError: Java heap space
java.lang.NullPointerException
at sun.awt.SunToolkit.postEvent(SunToolkit.java:473)
at sun.awt.windows.WComponentPeer.postEvent(WComponentPeer.java:849)
2>把最大堆内存调整到上限1024M
-XX:+PrintGCDetails -Xms1024m -Xmx1024m
实际获得的heap合计:990M
因为
NewRatio=2 default
SurvivorRatio=8 default
所以
Eden space=273M
Survivor space=34M
Tenured gen=683M
最终,成功执行完查找操作,只是很勉强(Tenured gen只剩下了1K)
结果如下:
3>从2>的结果可以看出,问题的关键在于Tenured gen的空间大小,尽可能地把空间分给Tenured gen是解决问题的关键,于是,我们可以追加-XX:NewRatio参数来调大Tenured gen的空间,比如:
-XX:+PrintGCDetails -Xms1024m -Xmx1024m -XX:NewRatio=4
因为绝大部分对象都是无法回收的,所以为了降低gc时间,其实我们也可以通过调大-XX:SurvivorRatio的值,变相拿掉Survivor space,比如:
-XX:+PrintGCDetails -Xms1024m -Xmx1024m -XX:NewRatio=4 -XX:SurvivorRatio=65536
4>之前使用的gc属于单线程的serial collector,比较适合于单机,如果想尝试一下CMS并发收集器的话,也是可以的,虽然必要性不大
-XX:+PrintGCDetails
-Xms1024m -Xmx1024m
-Xmn200m 直接指定年轻代大小,也可以通过-XX:NewRatio调节
-XX:SurvivorRatio=65536 变相去掉Survivor space
-XX:+UseConcMarkSweepGC 使用CMS内存收集
-XX:ReservedCodeCacheSize=10m 尽可能节省空间
-XX:MaxPermSize=20m 尽可能节省空间
-XX:+CMSScavengeBeforeRemark 强制remark之前开始一次minor gc,减少remark的暂停时间,不过我们这种情况没有必要加,因为大部分对象都不会被gc掉
-XX:+UseCMSInitiatingOccupancyOnly 为了配合CMSInitiatingOccupancyFraction使用,不指定的话,jvm根据历史数据自动判断什么时候进行gc
-XX:CMSInitiatingOccupancyFraction=95 Tenured gen代使用空间达到95%才进行gc
相关推荐
Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,使得开发者能够构建功能强大的桌面应用。在这个特定的情况下,这个小工具用于实时监控Java应用程序的内存使用情况,这对于调试和优化性能至关...
10. **Swing和JavaFX**:这两个是Java的图形用户界面(GUI)工具包,用于创建桌面应用程序。虽然Java 7主要关注Swing,但Java 8开始大力推广JavaFX。 这个教程的PDF版本分为多个部分,每个部分可能涵盖上述一个或多...
2. Swing和JavaFX:这两是Java的图形用户界面(GUI)工具包,用于创建桌面应用程序。 四、Java开发工具 1. Eclipse和IntelliJ IDEA:这两款是流行的Java集成开发环境(IDE),提供了代码编辑、调试、构建等功能,...
- **Swing或JavaFX**:如果是关于图形用户界面(GUI)编程,可能会介绍如何使用Swing或JavaFX库创建桌面应用程序。 - **多线程编程**:可能介绍了线程的创建、同步和通信,如synchronized关键字、wait()、notify()...
8. **JavaFX和Swing**:这两个是Java的图形用户界面(GUI)库,用于构建桌面应用程序。Swing是早期的选择,而JavaFX提供更现代的UI组件和动画效果。 9. **Java开发工具**:Eclipse、IntelliJ IDEA和NetBeans是流行...
7. **JavaFX和Swing GUI**:对于桌面应用开发,Java提供Swing和JavaFX两个库。书中会介绍如何创建图形用户界面,使用组件和布局管理器,以及如何响应用户事件。 8. **JVM优化**:理解JVM的工作原理对于性能调优至关...
这个平台包含了Java虚拟机(JVM)、类库以及编程工具,使得开发者能够创建功能丰富的、跨平台的应用程序。本课件将深入探讨J2SE的关键概念和技术。 一、Java虚拟机(JVM) Java虚拟机是Java平台的核心,它是运行...
Java的Socket编程是网络应用程序的基础,李刚在书中介绍了如何使用Java进行TCP和UDP通信。光盘代码中的网络编程实例,可以让读者实践创建服务器和客户端。 9. **数据库操作**: 数据库连接与操作是Java开发中常见...
标题中的“纯java实现 兼容所有Java平台以及Java语言的引擎”暗示了这是一个使用Java编程语言开发的软件引擎,其设计目标是能够在任何支持Java的平台上运行,无论是桌面环境、移动设备还是云端服务器。这样的引擎...
9. Swing GUI:Swing是Java的图形用户界面库,提供丰富的组件如JButton、JLabel、JFrame等,用于构建桌面应用程序。MVC模式被广泛应用在Swing组件的设计中。 10. JavaFX:作为Swing的替代,JavaFX提供更现代的UI...
8. **Swing与JavaFX**:Swing是Java提供的轻量级GUI库,用于构建桌面应用程序。JavaFX是更现代的图形用户界面工具包,支持2D/3D图形、媒体播放和富互联网应用。 9. **分布式计算**:Java的RMI(远程方法调用)和EJB...
最后,书中会讨论Java性能调优的策略和工具,包括内存管理、垃圾收集、JVM参数调整等,以及如何使用JConsole、VisualVM等工具进行性能分析和故障排查。 通过《专业Java JDK - 第5版》,读者不仅可以掌握Java编程的...
9. **JavaFX和Swing图形界面**:虽然这部分不是Java的核心,但书中可能也会提及如何使用JavaFX或Swing创建桌面应用程序的用户界面。 10. **数据库编程**:最后,可能还会介绍如何使用JDBC进行数据库操作,包括连接...
综上所述,“JAVA高级工程师2”这个主题涵盖了Java安全、多线程、图形开发、游戏制作、网络编程以及虚拟机调优等多个关键领域,这些都是一个合格的Java高级工程师需要深入研究和掌握的知识点。虽然IO部分在此主题中...
Java工程师高级培训教程1是一个专为已有基础的Java开发者设计的深入学习资源,涵盖了Java的高级主题,旨在提升技能和专业能力。这个1年的培训课程包括了Java安全、网络编程、多线程、图形用户界面(GUI)开发以及...
5. **JavaFX和Swing**:这两者是Java的GUI库,用于创建桌面应用程序。 **高级话题:** 1. **设计模式**:工厂模式、单例模式、装饰器模式等,是解决常见问题的成熟解决方案。 2. **Spring框架**:企业级应用开发的...
14. **Java虚拟机(JVM)**:JVM是Java程序的运行环境,书中会讲解JVM的工作原理、内存模型以及性能调优。 每个主题都会配以实例源码进行解析,让读者能够亲手实践,加深理解。通过《Java开发者年鉴1.4》,开发者不仅...
8. **Java SE、Java EE和Java ME**:Java分为三个版本,标准版(Java SE)、企业版(Java EE)和微型版(Java ME),分别应用于桌面应用、企业级服务器应用和嵌入式设备。 9. **垃圾回收**:Java自动管理内存,通过...
8. **Swing与JavaFX**:这两个是Java的GUI库,用于创建桌面应用程序。熟悉这些库可以创建美观且用户友好的界面。 9. **反射API**:反射允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。它是实现元...