Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

安卓设备内存溢出问题及解决方法 #6

Open
forrestsocool opened this issue Aug 9, 2017 · 0 comments
Open

安卓设备内存溢出问题及解决方法 #6

forrestsocool opened this issue Aug 9, 2017 · 0 comments

Comments

@forrestsocool
Copy link

forrestsocool commented Aug 9, 2017

It crashes due to a stack-over-flow problem everytime when I used the library as a socks5server running on Android device。Which is caused by the frequently allocated byte[] buffer using in StreamPipe.java。

I fixed this problem in two steps:

  1. reduce the byte[] buffer in StreamPipe.java to 256960
  2. use a BufferPool to allocate new buffer, witch can automatically deallocate memory when the buffer nums meet the setting max.

the BufferPool I used:

class BufferPool {
private static final int BUFFER_SIZE = 256960;     //缓冲包2M
private static final int BUFFER_MAX_NUM = 40;                   //缓冲池保留最大数量
private static final ConcurrentLinkedQueue<byte[]> buffers = new ConcurrentLinkedQueue<byte[]>();
private static AtomicInteger countCreated = new AtomicInteger(0);   //已创建的缓冲包个数

/**
 * 分配
 */
public static byte[] allocate() {
    byte[] result = buffers.poll();
    //创建新缓冲包
    if (result == null) {
        result = new byte[BUFFER_SIZE];

        //记录创建个数
        int count = countCreated.incrementAndGet();

        //日志
        if (count <= BUFFER_MAX_NUM) {
            logger.info("创建新的BufferPool缓冲池,已创建总数量:count={}", count);
        } else {
            logger.warn("创建新的BufferPool缓冲池,已创建总数量:count={}", count, new Throwable());
        }
    }
    return result;
}

/**
 * 回收
 *
 * @param buff
 */
public static void deallocate(byte[] buff) {
    //缓冲池已达上限
    if (buffers.size() >= BUFFER_MAX_NUM) return;
    //回收的缓冲大小必须正确
    if (buff.length != BUFFER_SIZE) return;

    //加回到池中
    buffers.add(buff);
}
}

Anyway, I didn't tested the performance influenced by the reduction of buffer size and nums。maybe there is another good way to make it runner better on Android.

Your code is Excellent !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant