You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@rocketmq.apache.org by goman <28...@qq.com> on 2017/06/12 13:52:38 UTC

关于使用 -XX:MaxDirectMemorySize=15g

hi all, 想请教个问题


我在4.0.0版本的项目里,看到 runbroker.sh 中指定了jvm flag : -XX:MaxDirectMemorySize=15g。


如果我没理解错,这个参数只会在调用 DirectByteBuffer(int cap) 这个构造方法时才检查DirectBuffer是否使用超量,
因为这个方法调用了 java.nio.Bits.reserveMemory(size, cap)来检查DirectBuffer使用量、判断是否进行full gc、是否抛oom Excpetion。


但是rocketmq在构造MappedByteBuffer时,使用的是DirectByteBuffer(int cap, long addr, FileDescriptor fd, Runnable unmapper) 这个构造方法,
详见sun.nio.ch.FileChannelImpl 的 public MappedByteBuffer map(MapMode var1, long var2, long var4) 


如果我没理解错,rocketmq只会在存储和通信两个模块用到DirectBuffer。
存储模块就是我上面说的,构造MappedByteBuffer来操作page cache,构造它不会受到 -XX:MaxDirectMemorySize 的限制;
通信模块使用的DirectBuffer对应的是socket buffer,而如果是为socket buffer而设置15g的内存阀值,也是说不通的。


所以相关同学能否帮忙解答一下 -XX:MaxDirectMemorySize=15g 设置这个value的原因?


谢谢!

回复: 关于使用 -XX:MaxDirectMemorySize=15g

Posted by goman <28...@qq.com>.
明白了,谢谢!




------------------ 原始邮件 ------------------
发件人: "Zhanhui Li";<li...@gmail.com>;
发送时间: 2017年6月13日(星期二) 上午9:36
收件人: "users"<us...@rocketmq.incubator.apache.org>; 

主题: Re: 关于使用 -XX:MaxDirectMemorySize=15g



4.x 版本引入了TransientStorePool, 启用该特性的话, 会使用较多的DirectMemory; 增加这个参数限制, 个人感觉, 更多是防御性编程.

> 在 2017年6月12日,下午9:52,goman <28...@qq.com> 写道:
> 
> hi all, 想请教个问题
> 
> 我在4.0.0版本的项目里,看到 runbroker.sh 中指定了jvm flag : -XX:MaxDirectMemorySize=15g。
> 
> 如果我没理解错,这个参数只会在调用 DirectByteBuffer(int cap) 这个构造方法时才检查DirectBuffer是否使用超量,
> 因为这个方法调用了 java.nio.Bits.reserveMemory(size, cap)来检查DirectBuffer使用量、判断是否进行full gc、是否抛oom Excpetion。
> 
> 但是rocketmq在构造MappedByteBuffer时,使用的是DirectByteBuffer(int cap, long addr, FileDescriptor fd, Runnable unmapper) 这个构造方法,
> 详见sun.nio.ch.FileChannelImpl 的 public MappedByteBuffer map(MapMode var1, long var2, long var4) 
> 
> 如果我没理解错,rocketmq只会在存储和通信两个模块用到DirectBuffer。
> 存储模块就是我上面说的,构造MappedByteBuffer来操作page cache,构造它不会受到 -XX:MaxDirectMemorySize 的限制;
> 通信模块使用的DirectBuffer对应的是socket buffer,而如果是为socket buffer而设置15g的内存阀值,也是说不通的。
> 
> 所以相关同学能否帮忙解答一下 -XX:MaxDirectMemorySize=15g 设置这个value的原因?
> 
> 谢谢!

Re: 关于使用 -XX:MaxDirectMemorySize=15g

Posted by Zhanhui Li <li...@gmail.com>.
4.x 版本引入了TransientStorePool, 启用该特性的话, 会使用较多的DirectMemory; 增加这个参数限制, 个人感觉, 更多是防御性编程.

> 在 2017年6月12日,下午9:52,goman <28...@qq.com> 写道:
> 
> hi all, 想请教个问题
> 
> 我在4.0.0版本的项目里,看到 runbroker.sh 中指定了jvm flag : -XX:MaxDirectMemorySize=15g。
> 
> 如果我没理解错,这个参数只会在调用 DirectByteBuffer(int cap) 这个构造方法时才检查DirectBuffer是否使用超量,
> 因为这个方法调用了 java.nio.Bits.reserveMemory(size, cap)来检查DirectBuffer使用量、判断是否进行full gc、是否抛oom Excpetion。
> 
> 但是rocketmq在构造MappedByteBuffer时,使用的是DirectByteBuffer(int cap, long addr, FileDescriptor fd, Runnable unmapper) 这个构造方法,
> 详见sun.nio.ch.FileChannelImpl 的 public MappedByteBuffer map(MapMode var1, long var2, long var4) 
> 
> 如果我没理解错,rocketmq只会在存储和通信两个模块用到DirectBuffer。
> 存储模块就是我上面说的,构造MappedByteBuffer来操作page cache,构造它不会受到 -XX:MaxDirectMemorySize 的限制;
> 通信模块使用的DirectBuffer对应的是socket buffer,而如果是为socket buffer而设置15g的内存阀值,也是说不通的。
> 
> 所以相关同学能否帮忙解答一下 -XX:MaxDirectMemorySize=15g 设置这个value的原因?
> 
> 谢谢!