由dubbo服务禁用system.gc而引起的思考
- final class SocketReceiveBufferPool {
- private static final int POOL_SIZE = 8;
- @SuppressWarnings("unchecked")
- private final SoftReference<ByteBuffer>[] pool = new SoftReference[POOL_SIZE];
- SocketReceiveBufferPool() {
- super();
- }
- final ByteBuffer acquire(int size) {
- final SoftReference<ByteBuffer>[] pool = this.pool;
- for (int i = 0; i < POOL_SIZE; i ++) {
- SoftReference<ByteBuffer> ref = pool[i];
- if (ref == null) {
- continue;
- }
- ByteBuffer buf = ref.get();
- if (buf == null) {
- pool[i] = null;
- continue;
- }
- if (buf.capacity() < size) {
- continue;
- }
- pool[i] = null;
- buf.clear();
- return buf;
- }
- ByteBuffer buf = ByteBuffer.allocateDirect(normalizeCapacity(size));
- buf.clear();
- return buf;
- }
- final void release(ByteBuffer buffer) {
- final SoftReference<ByteBuffer>[] pool = this.pool;
- for (int i = 0; i < POOL_SIZE; i ++) {
- SoftReference<ByteBuffer> ref = pool[i];
- if (ref == null || ref.get() == null) {
- pool[i] = new SoftReference<ByteBuffer>(buffer);
- return;
- }
- }
- // pool is full - replace one
- final int capacity = buffer.capacity();
- for (int i = 0; i< POOL_SIZE; i ++) {
- SoftReference<ByteBuffer> ref = pool[i];
- ByteBuffer pooled = ref.get();
- if (pooled == null) {
- pool[i] = null;
- continue;
- }
- if (pooled.capacity() < capacity) {
- pool[i] = new SoftReference<ByteBuffer>(buffer);
- return;
- }
- }
- }
- private static final int normalizeCapacity(int capacity) {
- // Normalize to multiple of 1024
- int q = capacity >>> 10;
- int r = capacity & 1023;
- if (r != 0) {
- q ++;
- }
- return q << 10;
- }
- }
- private boolean read(SelectionKey k) {
- final SocketChannel ch = (SocketChannel) k.channel();
- final NioSocketChannel channel = (NioSocketChannel) k.attachment();
- final ReceiveBufferSizePredictor predictor =
- channel.getConfig().getReceiveBufferSizePredictor();
- final int predictedRecvBufSize = predictor.nextReceiveBufferSize();
- int ret = 0;
- int readBytes = 0;
- boolean failure = true;
- ByteBuffer bb = recvBufferPool.acquire(predictedRecvBufSize);
- try {
- while ((ret = ch.read(bb)) > 0) {
- readBytes += ret;
- if (!bb.hasRemaining()) {
- break;
- }
- }
- failure = false;
- } catch (ClosedChannelException e) {
- // Can happen, and does not need a user attention.
- } catch (Throwable t) {
- fireExceptionCaught(channel, t);
- }
- if (readBytes > 0) {
- bb.flip();
- final ChannelBufferFactory bufferFactory =
- channel.getConfig().getBufferFactory();
- final ChannelBuffer buffer = bufferFactory.getBuffer(readBytes);
- buffer.setBytes(0, bb);
- buffer.writerIndex(readBytes);
- //if(buffer instanceof BigEndianHeapChannelBuffer){
- // logger2.info("buffer instanceof BigEndianHeapChannelBuffer.");
- //}
- recvBufferPool.release(bb);
- // Update the predi||\\|||||
- predictor.previousReceiveBufferSize(readBytes);
- // Fire the event.
- fireMessageReceived(channel, buffer);
- } else {
- recvBufferPool.release(bb);
- }
- if (ret < 0 || failure) {
- k.cancel(); // Some JDK implementations run into an infinite loop without this.
- close(channel, succeededFuture(channel));
- return false;
- }
- return true;
- }
由dubbo服务禁用system.gc而引起的思考的更多相关文章
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
- Dubbo_创建Dubbo服务并在ZooKeeper注册,然后通过Jar包执行
一.安装ZooKeeper(略) 二.创建Dubbo服务 1.DemoService 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- RPC -dubbo 服务导出实现
在阅读此文章之前,我希望阅读者对Spring 扩展机制的有一定的了解,比如:自定义标签与Spring整合, InitializingBean 接口,ApplicationContextAware,Be ...
- Dubbo 服务治理-mock实例
转: Dubbo 服务治理-mock实例 老生住长亭 2017.02.28 10:56* 字数 514 阅读 2552评论 10喜欢 2 Dubbo的mock自己折腾的实例,配置信息有点简陋,有点粗鄙 ...
- dubbo系列四、dubbo服务暴露过程源码解析
一.代码准备 1.示例代码 参考dubbo系列二.dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台) 2.简单了解下spring自定义标签 https://w ...
- (五)消费Dubbo服务
前面我们搞了发布Dubbo服务,发布的服务就是用来消费的,所以我们这里来调用服务,消费下: 创建maven项目 dubbo-demo-consumer pom.xml配置下: <dependen ...
- (三)发布Dubbo服务
我们现在来学习下发布Dubbo服务,主要参考dubbo开发包里的demo源码:由浅入深的讲解下这个小demo: github地址:https://github.com/apache/incubator ...
- 关于dubbo服务的xml配置文件报错的问题
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...
- Dubbo学习笔记2:Dubbo服务提供端与消费端应用的搭建
Demo结构介绍 Demo使用Maven聚合功能,里面有三个模块,目录如下: 其中Consumer模块为服务消费者,里面TestConsumer和consumer.xml组成了基于Spring配置方式 ...
随机推荐
- Mysql 查询条件中字符串尾部有空格也能匹配上的问题
一.表结构 TABLE person id name 1 你 2 你(一个空格) 3 你(二个空格) 二.查询与结果 select * from person where `name` = ? 无论 ...
- Beta 冲刺day3
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是对第三方与企业复杂的逻辑关系进行分析和优化,以及进行部分模块的功能测试和代码测试. 今天解决的进度:根据前天得到的需求问题进行 ...
- spring中配置quartz调用两次及项目日志log4j不能每天生成日志解决方法
在quartz中配置了一个方法运行时会连续调用两次,是因为加载两次,只需在tomcat的server.xml中修改配置 <Host name="www.xx.cn" appB ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- 一些遇到的Qt程序在Windows平台间移植问题整理
今天尝试把Qt程序移植到各种虚拟机中测试,由于Qt的依赖库报告往往不能显示出全部依赖库.结果频频出现问题,好不容易全部解决了,这里给出一些套路. 首先对于Qt版本,我用过很多,最终表示现阶段推荐Min ...
- CSS(选择器)
CSS(选择器) 作用:用于匹配 HTML 元素 选择器分类: 1.元素选择器 a{} 2.伪元素选择器 ::before{} (真实存在的元素) 3.类选择器 .link{} 4.属性选择 ...
- EF Core Model更新迁移
EF Core 迁移 感觉就是以前EF Code First的自动同步数据库功能 内容:在你新增.更新TableModel后,如何自动化的更新DB中的真实Table.以及对这些更改进行一个版本控制. ...
- 免费Git客户端:sourcetree详细介绍
一.简介:一个用于Windows和Mac的免费Git客户端.Sourcetree简化了如何与Git存储库进行交互,这样您就可以集中精力编写代码.通过Sourcetree的简单Git GUI可视化和管理 ...
- ubuntu 命令整合2
通配符 * 匹配任意多个字符 ?匹配一个任意字符 示例:ls *.txt rm -rf *.txt 文本编辑器 vi.vim 格式:vi 文件名 编辑 vi的三种工作模式 正常模式(启动进入的模式) ...
- Java 使用BigDecimal类处理高精度计算
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的 ...