`

一个Java swing桌面应用程序的JVM内存调优

阅读更多
背景介绍

       用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

 



 

  • 大小: 108.2 KB
  • 大小: 99.1 KB
  • 大小: 80.9 KB
分享到:
评论

相关推荐

    Sun 用 swing写的内存监控小工具,很强

    Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,使得开发者能够构建功能强大的桌面应用。在这个特定的情况下,这个小工具用于实时监控Java应用程序的内存使用情况,这对于调试和优化性能至关...

    Java语言程序设计教程(Java 7) 入门与提高篇PPT

    10. **Swing和JavaFX**:这两个是Java的图形用户界面(GUI)工具包,用于创建桌面应用程序。虽然Java 7主要关注Swing,但Java 8开始大力推广JavaFX。 这个教程的PDF版本分为多个部分,每个部分可能涵盖上述一个或多...

    计算机软件开发的JAVA编程语言及其实际应用.zip

    2. Swing和JavaFX:这两是Java的图形用户界面(GUI)工具包,用于创建桌面应用程序。 四、Java开发工具 1. Eclipse和IntelliJ IDEA:这两款是流行的Java集成开发环境(IDE),提供了代码编辑、调试、构建等功能,...

    Java语言程序设计 基础篇 原书第10版 ,梁勇著 ,P656

    - **Swing或JavaFX**:如果是关于图形用户界面(GUI)编程,可能会介绍如何使用Swing或JavaFX库创建桌面应用程序。 - **多线程编程**:可能介绍了线程的创建、同步和通信,如synchronized关键字、wait()、notify()...

    计算机软件Java编程及应用分析.zip

    8. **JavaFX和Swing**:这两个是Java的图形用户界面(GUI)库,用于构建桌面应用程序。Swing是早期的选择,而JavaFX提供更现代的UI组件和动画效果。 9. **Java开发工具**:Eclipse、IntelliJ IDEA和NetBeans是流行...

    Java语言程序设计.进阶篇(原书第8版)

    7. **JavaFX和Swing GUI**:对于桌面应用开发,Java提供Swing和JavaFX两个库。书中会介绍如何创建图形用户界面,使用组件和布局管理器,以及如何响应用户事件。 8. **JVM优化**:理解JVM的工作原理对于性能调优至关...

    java 2 standard edition platform

    这个平台包含了Java虚拟机(JVM)、类库以及编程工具,使得开发者能够创建功能丰富的、跨平台的应用程序。本课件将深入探讨J2SE的关键概念和技术。 一、Java虚拟机(JVM) Java虚拟机是Java平台的核心,它是运行...

    疯狂Java讲义光盘代码

    Java的Socket编程是网络应用程序的基础,李刚在书中介绍了如何使用Java进行TCP和UDP通信。光盘代码中的网络编程实例,可以让读者实践创建服务器和客户端。 9. **数据库操作**: 数据库连接与操作是Java开发中常见...

    纯java实现 兼容所有Java平台以及Java语言的引擎

    标题中的“纯java实现 兼容所有Java平台以及Java语言的引擎”暗示了这是一个使用Java编程语言开发的软件引擎,其设计目标是能够在任何支持Java的平台上运行,无论是桌面环境、移动设备还是云端服务器。这样的引擎...

    Java 学习笔记Java学习笔记

    9. Swing GUI:Swing是Java的图形用户界面库,提供丰富的组件如JButton、JLabel、JFrame等,用于构建桌面应用程序。MVC模式被广泛应用在Swing组件的设计中。 10. JavaFX:作为Swing的替代,JavaFX提供更现代的UI...

    java.7z

    8. **Swing与JavaFX**:Swing是Java提供的轻量级GUI库,用于构建桌面应用程序。JavaFX是更现代的图形用户界面工具包,支持2D/3D图形、媒体播放和富互联网应用。 9. **分布式计算**:Java的RMI(远程方法调用)和EJB...

    Professional Java Jdk - 5th Edition

    最后,书中会讨论Java性能调优的策略和工具,包括内存管理、垃圾收集、JVM参数调整等,以及如何使用JConsole、VisualVM等工具进行性能分析和故障排查。 通过《专业Java JDK - 第5版》,读者不仅可以掌握Java编程的...

    疯狂java第5部分

    9. **JavaFX和Swing图形界面**:虽然这部分不是Java的核心,但书中可能也会提及如何使用JavaFX或Swing创建桌面应用程序的用户界面。 10. **数据库编程**:最后,可能还会介绍如何使用JDBC进行数据库操作,包括连接...

    JAVA高级工程师2

    综上所述,“JAVA高级工程师2”这个主题涵盖了Java安全、多线程、图形开发、游戏制作、网络编程以及虚拟机调优等多个关键领域,这些都是一个合格的Java高级工程师需要深入研究和掌握的知识点。虽然IO部分在此主题中...

    2008JAVA工程师高级培训教程1

    Java工程师高级培训教程1是一个专为已有基础的Java开发者设计的深入学习资源,涵盖了Java的高级主题,旨在提升技能和专业能力。这个1年的培训课程包括了Java安全、网络编程、多线程、图形用户界面(GUI)开发以及...

    java从入门到放弃_java_goeshbm_

    5. **JavaFX和Swing**:这两者是Java的GUI库,用于创建桌面应用程序。 **高级话题:** 1. **设计模式**:工厂模式、单例模式、装饰器模式等,是解决常见问题的成熟解决方案。 2. **Spring框架**:企业级应用开发的...

    Java经典实例(The Java Developers Almanac)

    14. **Java虚拟机(JVM)**:JVM是Java程序的运行环境,书中会讲解JVM的工作原理、内存模型以及性能调优。 每个主题都会配以实例源码进行解析,让读者能够亲手实践,加深理解。通过《Java开发者年鉴1.4》,开发者不仅...

    java 电子教案ppt

    8. **Java SE、Java EE和Java ME**:Java分为三个版本,标准版(Java SE)、企业版(Java EE)和微型版(Java ME),分别应用于桌面应用、企业级服务器应用和嵌入式设备。 9. **垃圾回收**:Java自动管理内存,通过...

    330 个 有用的Java Tips

    8. **Swing与JavaFX**:这两个是Java的GUI库,用于创建桌面应用程序。熟悉这些库可以创建美观且用户友好的界面。 9. **反射API**:反射允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。它是实现元...

Global site tag (gtag.js) - Google Analytics