`
zhao3546
  • 浏览: 21877 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用Mina出现的JNI OutOfMemory的解决方法

阅读更多
最新在使用MINA作了UDP服务器和UDP客户端,在最后性能测试时,总是遇到OutOfMemory的问题,很是郁闷,定位了三天,后来终于找到了解决方法。和大家分享一下,以免大家再走同样的弯路。

我们性能测试场景如下:
Client起100个线程同时向Server发UDP消息,Server接收到请求后立即向Client回响应;
在前10秒内,服务器响应特别快,大概每秒可以达到4000个消息,但到了10多秒后,服务器的响应就越来越慢,后来基本上就不响应,又或者直接OutOfMemory,并出现下面的错:
request <size> bytes for <reason>. Out of swap space?

一开始我们一直以为是缓存中的对象未清理掉而导致的问题,定位了一段时间后,发现缓存中的内容已经及时清理了。打开GC日志,也没有发现问题。

后来,我们就开始上网狂找资料,发现原来Java内存分为两种,Heap内存和JVM使用的内存,
Heap内存就是一般的JAVA对象使用内存;
JVM使用的内存,就是指JVM在运行过程中要使用的内存,JVM最终要通过调用JNI,本地方法运行也是需要内存的,这部分内存JVM直接向OS申请。

既然我们自己的代码中使用的JAVA对象已经及时清理,那是不是JNI内存泄漏了?可是我们的代码,基本上没有使用JNI啊。难道是MINA的问题?大概看了下MINA的源码,MINA是使用Java的NIO包下的类来实现的,打开Java的-verbose:jni选项,可以看出,NIO中的类很多都是通过JNI来实现的。

好了,继续定位,发现我们的代码中,大量使用了MINA提供的IoBuffer类,MINA为我们构造了大量的IoBuffer对象,我们自己也构造了大量的IoBuffer对象,会不会这个类的对象没有及时清理?

带着疑问,我看了IoBuffer的所有方法,其中有个free()方法,看了注释,是用来清理内存的。
于是尝试在所有使用完IoBuffer的代码处都加上了调用free()方法的代码,再进行测试,终于OK了。

UDP服务器稳定运行后,内存最大只使用了200多M,问题搞定。

所有使用Java的NIO包下的类,最好都多注意下JDK文档,看是否需要主动调用某方法来释放内容。
分享到:
评论
3 楼 shijiyu 2008-10-07  
初学 还没给晕倒你们的问题 (*^__^*) 嘻嘻……
2 楼 zhao3546 2008-09-06  
调用IoBuffer.free()方法后,不再出现异常,内存使用很稳定。
谢谢 dennis_zane 的指点。
我再试试你说的方法,看性能会不会有提升。
1 楼 dennis_zane 2008-09-06  
你们用的是Direct ByteBuffer吧,Direct ByteBuffer是在虚拟机之外分配内存的,因此设置-Xmx并不会有作用,这个大小可以通过-XX:MaxDirectMemorySize=<size>参数来调节。free()方法并没有要求强制调用,但是主动调用的话可以提高性能表现。

相关推荐

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...

    MINA断线重连死锁解决

    当我们遇到"MINA断线重连死锁解决"的问题时,通常涉及到的是网络连接的稳定性和并发处理的复杂性。 MINA框架提供了非阻塞I/O模型,允许处理大量并发连接。然而,在某些情况下,特别是在断线重连的机制中,可能会...

    mina 断包,粘包问题解决

    本文将深入探讨“mina断包”和“粘包”问题,以及如何通过提供的mina_optimize代码解决这些问题。 首先,我们要理解什么是“断包”和“粘包”。在TCP/IP通信中,数据通常会被拆分成多个数据段进行传输,这在传输...

    使用MINA实现长连接

    5. **数据传输:** MINA提供异步写入数据的方法,通过调用Session的write方法,数据会被添加到写缓冲区,MINA会在适当的时候自动发送。 6. **保持连接:** 长连接意味着在没有异常情况下,连接会一直保持打开状态。...

    Android2.2配合Mina时,出现的问题及完美解决方案

    本文将深入探讨在Android 2.2版本上集成Mina框架时可能出现的问题,以及如何找到这些问题的完美解决方案。 Mina(Java Network Application Platform)是一个开源的网络应用框架,它提供了一个高效的、可扩展的网络...

    mina框架的使用

    Apache MINA(Multipurpose ...通过研究这些源代码,读者可以更直观地了解MINA框架的使用方法和实现细节。学习这个项目,你可以动手实践MINA的基本用法,理解异步编程模型,以及如何处理网络通信中的各种事件。

    mina2 实例程序(socket通讯调用远程方法)

    本篇文章将深入探讨如何使用Mina2进行Socket通信,并实现远程方法调用。 Apache Mina2是一个基于事件驱动和异步模型的网络应用框架,它为各种协议如TCP/IP、UDP/IP和HTTP等提供了一种统一的抽象层。Mina2通过高度...

    Mina+Socket通信

    总的来说,Mina与Socket结合使用,可以构建出高效、灵活的网络通信解决方案。Mina的高级抽象简化了网络编程的复杂性,而Socket则提供了基础的网络通信能力。理解这两者的原理和用法,对于提升Java网络编程技能至关...

    java-mina通信框架详解.docx

    Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当...

    MINA_API+MINA_DOC+mina

    通过这个文档,开发者可以详细了解到MINA提供的各种接口、类和方法,包括IO服务端和客户端的创建、协议编码和解码、事件驱动模型等核心概念。例如,NioSession代表网络连接会话,FilterChain用于处理数据过滤,...

    mina新手教程源码 mina+springboot+idea最简单的案例。

    mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...

    从Github检出Mina(maven)项目出现问题解决过程

    本文将详细解析“从Github检出Mina(maven)项目出现问题解决过程”的主题,帮助开发者们理解和处理类似的问题。 首先,Mina是一个高性能、轻量级的网络通信框架,常用于构建网络应用,如服务器和客户端。它提供了...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和...同时,这也有助于你理解如何将Mina与其他技术(如Spring框架)结合使用,提升整体系统的灵活性和可维护性。

    MINA开发手册和JAR包

    3. **API详解**:详细阐述MINA提供的各种接口和类,以及它们的使用方法。 4. **最佳实践**:分享在实际项目中优化MINA应用的经验和技巧。 5. **示例代码**:通过实例代码展示MINA如何处理常见的网络通信问题。 **...

    mina使用例子

    通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...

    一种基于Mina状态机的高性能服务器的设计方法

    该方法使用 Mina 网络应用程序框架和有限状态机,对服务器的设计和实现进行了深入研究和分析。 Mina 网络应用程序框架是基于 Java NIO 技术的异步 I/O 和事件驱动机制,提供了一个高效的网络应用程序开发框架。该...

    使用mina框架实现cmpp2.0服务端

    1. **连接管理**:使用Mina的Acceptor来监听特定端口,接受来自移动网关的连接请求。每个连接通常对应一个独立的工作线程,处理来自客户端的CMPP请求。 2. **会话建立**:实现CMPP连接的认证机制,包括基于IP地址、...

    MINA使用札记(CumulativeProtocolDecoder使用)

    《MINA使用札记——CumulativeProtocolDecoder使用详解》 MINA(Java Multithreaded Network Application Framework)是一个强大的、高性能的Java网络应用框架,它主要用于构建可伸缩的、高性能的服务端应用,如...

    mina

    3. **MINA使用手记[1] .shtml** 和 **MINA框架使用总结 .shtml**:这些可能是个人或团队在使用MINA过程中的笔记和总结,可能包含了实践中的技巧、问题解决策略以及最佳实践。 4. **Apache MINA 线程模型配置 .shtml...

    mina连接 mina心跳连接 mina断线重连

    在提供的文件"minaConnect"中,可能包含了使用Mina实现上述功能的相关代码示例和配置。通过分析这些文件,可以更具体地了解如何在实际项目中应用Mina的连接、心跳和断线重连机制。不过,具体的实现细节和优化策略需...

Global site tag (gtag.js) - Google Analytics