`
Rocky_rup
  • 浏览: 145340 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

应用DirectBuffer提升系统性能

阅读更多

Java 2 SE 6 doc :

Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer’s content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system’s native I/O operations.

  • DirectBuffer通过免去中间交换的内存拷贝, 提升IO处理速度;

Java 2 SE 6 doc :

The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint of an application might not be obvious.

  • DirectBuffer-XX:MaxDirectMemorySize=xxM大小限制下[1], 使用Heap之外的内存, GC对此"无能为力"[2], 也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响.

因此, 当系统应用场景满足:

  • 大量原生类型数据使用
  • 频繁IO操作
  • 系统处理响应速度要求快且稳定

典型场景是网络数据传输, 可考虑合理应用DirectBuffer.

 

  1. MappedByteBuffer不受-XX:MaxDirectMemorySize=xxM大小限制.
  2. 下面的代码可验证程序运行中GC不尝试回收DirectBuffer:
  • 程序运行命令

 

 

 

java -XX:MaxDirectMemorySize=11M cn.cafusic.direct.buffer.gc.DirectBufferGCTest  <mode> <size>
  •   GC监控命令

 

jstat -gcutil <pid> 1000 60
  •  代码

 

package cn.cafusic.direct.buffer.gc;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
 * DirectBufferGCTest
 * 
 * @author <a href=mailto:jushi@taobao.com>jushi</a>
 * @created 2010-8-19
 * 
 */
public class DirectBufferGCTest {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(final String[] args) throws Exception {

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                running = false;
            }
        });

        final char mode = args[0].charAt(0);
        final int size = Integer.parseInt(args[1]);

        Callable<?> callable = null;
        switch (mode) {
            case RELEASE:
                callable = new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        final ByteBuffer[] buffers = new ByteBuffer[size];
                        int i = 0;
                        while (running) {
                            if (i == buffers.length) i = 0;
                            final ByteBuffer buffer = newBuffer(true);
                            buffers[i++] = buffer;
                            TimeUnit.SECONDS.sleep(1);
                        }
                        return null;
                    }

                };
                break;
            case HEAP:
                callable = new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        final ByteBuffer[] buffers = new ByteBuffer[size];
                        int i = 0;
                        while (running) {
                            if (i == buffers.length) i = 0;
                            final ByteBuffer buffer = newBuffer(false);
                            buffers[i++] = buffer;
                            TimeUnit.SECONDS.sleep(1);
                        }
                        return null;
                    }

                };
                break;
            case MAPPED:
                callable = new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        final RandomAccessFile file =
                            new RandomAccessFile("raf.test", "rw");
                        file.setLength(size * CAPACITY);
                        final MappedByteBuffer map =
                            file.getChannel().map(MapMode.READ_WRITE,
                                                  0,
                                                  file.length());
                        while (running) {
                            while (map.hasRemaining()) {
                                map.put((byte) 4);
                            }
                            map.clear();
                            TimeUnit.SECONDS.sleep(1);
                        }

                        file.close();
                        return null;
                    }

                };

                break;
            case KEEP:
                callable = new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        final ByteBuffer[] buffers = new ByteBuffer[size];
                        for (int i = 0; i < buffers.length; i++) {
                            buffers[i] = newBuffer(true);
                        }
                        while (running) {
                            TimeUnit.SECONDS.sleep(1);
                        }
                        return null;
                    }

                };

                break;

            default:
                throw new RuntimeException("error mode : " + mode);
        }

        callable.call();

    }

    static ByteBuffer newBuffer(final boolean direct) {
        final ByteBuffer buffer =
            direct ? ByteBuffer.allocateDirect(CAPACITY)
                : ByteBuffer.allocate(CAPACITY);
        while (buffer.hasRemaining()) {
            buffer.put((byte) 5);
        }
        return buffer;
    }

    private static final int CAPACITY = 1024 * 1024;

    private static final char HEAP = 'h';

    private static final char KEEP = 'k';

    private static final char MAPPED = 'm';

    private static final char RELEASE = 'r';

    private static boolean running = true;

}
 

 

0
1
分享到:
评论

相关推荐

    Oracle9i数据库性能调优技术应用研究.pdf

    对于像本钢电能量计量管理系统这样复杂的系统,由于应用系统设计难以修改,基于性能调整准则的方法更为实用。通过对内存参数的分析和调整,如数据高速缓存的大小,可以有效地提高数据库系统对内存的利用率,进而提升...

    buffer cache深度分析.zip

    Buffer Cache是数据库管理系统中至关重要的一个组件,尤其是在Java应用程序中,它对于提升系统性能起着决定性作用。Buffer Cache深度分析涉及到内存管理、缓存命中率优化、并发控制等多个方面,是理解Java数据库连接...

    系统稳定性——OutOfMemoryError常见原因及解决方法1

    【系统稳定性——OutOfMemoryError常见原因及解决方法】 在Java应用程序中,系统稳定性的一个关键因素是避免出现`...通过理解和应用上述方法,可以有效地预防和解决这类问题,从而提升应用的性能和可用性。

    Mycat性能调优指南2

    JVM内存主要分为两大块:Java堆内存和直接内存映射(DirectBuffer占用)。推荐配置如下: - **堆内存**: 建议保持适中大小,例如在一个拥有16GB内存的服务器上,可以将Mycat的堆内存设置为4GB。 - **直接内存映射**...

    Agrona-Java和C高性能的数据结构和实用方法

    - **零拷贝**:Agrona利用NIO的Direct Buffer,实现了零拷贝技术,减少了数据在内存层次间的复制,提升了I/O性能。 - **内存预分配**:通过预先分配并管理内存,Agrona避免了动态内存分配的开销,特别是在高并发...

    缓冲池 java

    Heap Buffer存储在Java堆中,而Direct Buffer存储在系统内存中,直接与硬件交互,减少了Java虚拟机(JVM)的内存拷贝,提高了性能。然而,Direct Buffer可能会占用更多的系统资源,因此在选择时需要权衡性能和资源...

    Direct3D游戏开发粒子系统喷泉源代码

    在绘制时,我们可以通过索引缓冲(Index Buffer)进行批处理渲染,进一步提升性能。 对于喷泉效果,粒子的发射位置通常设定为固定点,如水面。为了模拟水花四溅,可以设定一定的随机偏移。粒子的颜色可以随着高度...

    Rt-thead studio软件下使用ringbuffer

    通过理解并熟练应用上述知识点,开发者可以在RT-Thread Studio环境下高效地利用RingBuffer解决实际问题,提升系统性能。在实际项目中,务必根据需求进行适当的优化和调整,确保RingBuffer的使用既安全又高效。

    databuffer_test.rar_databuffer_directfb

    在IT领域,特别是嵌入式系统和图形用户界面开发中,DirectFB是一个重要的库,它提供了高效的帧缓冲管理,使得开发者能够轻松地处理图形、...理解DataBuffer的使用对于提升DirectFB应用程序的性能和用户体验至关重要。

    Netty系列之Netty高性能实践.pdf

    2.2.3. **零拷贝技术**:Netty通过直接缓冲区(Direct Buffer)和FileChannel的transferTo方法等手段,尽可能减少数据在内存中的复制,进一步提高性能。 通过以上策略,Netty能够轻松支持10万TPS的跨节点远程服务...

    基于java的网络应用框架 Netty.zip

    8. **零拷贝技术**:通过DirectBuffer和FileRegion实现零拷贝,减少CPU内存复制操作,提升系统性能。 9. **异常处理**:Netty 提供了统一的异常处理机制,方便开发者处理各种网络异常。 10. **易于调试**:Netty ...

    mina高性能Java网络框架 v2.0.23.zip

    6. **内存管理**:MINA使用DirectBuffer和ByteBuffer进行内存管理,减少了Java对象创建和垃圾收集的开销,提升了性能。 7. **API设计**:MINA的API设计简洁且易于使用,提供了丰富的接口和类,帮助开发者快速开发...

    MySQL DBA性能调优 全攻略

    MySQL作为一种广泛使用的开源关系型数据库管理系统,其性能调优成为了提高应用响应速度、提升用户体验的关键环节。本文将详细介绍MySQL数据库性能调优的方法和技术,包括操作系统层面的优化、文件系统的选择、硬件...

    db2数据库性能优化

    内存管理对DB2的性能至关重要,合理的内存分配可以显著提升性能。 ##### 内存使用 - **EDM Pool**:专门用于存储执行计划和其他临时数据的内存池。 - **目录缓存/包缓存**:用于缓存目录信息和编译好的SQL语句,...

    Netty 25道面试题你和答案.docx

    3. **内存零拷贝**:通过Direct Buffer支持Zero-Copy机制,减少了CPU上下文切换,提升了效率。 4. **协议支持**:对高性能序列化协议如Protobuf的内置支持,加速了数据的序列化和反序列化过程。 Netty 的高可靠性则...

    完全剖析direct3d

    Direct3D是微软开发的一种图形应用程序接口(API),主要用于创建高性能的三维图形,尤其是在游戏开发、虚拟现实和专业可视化领域。本篇文章将深入探讨Direct3D的核心概念、关键技术和应用场景。 一、Direct3D概述 ...

    微软官方Windows8 Direct3D Tutorial Sample

    8. **性能优化**:如何通过优化资源管理、减少状态切换和提升渲染效率来提升Direct3D应用程序的性能。 压缩包中的`description.html`可能是教程的详细说明,`license.rtf`包含了使用条款,而`description`可能是...

Global site tag (gtag.js) - Google Analytics