当前位置: 首页 > news >正文

iis默认网站路径/郑州中原区最新消息

iis默认网站路径,郑州中原区最新消息,做淘客网站要多大的服务器,网站建设 博采网络 学校Netty是一个用来开发基于网络应用的框架,同时也提供了其他与socket I/O无关的基础类。Buffer APIio.netty.buffer 提供了一个通用的buffer类型ByteBuf类。他与java.nio.ByteBuffer类似,但是更加性能,对用户更友好和可扩展。友好性当你在调用j…

Netty是一个用来开发基于网络应用的框架,同时也提供了其他与socket I/O无关的基础类。

Buffer API

io.netty.buffer 提供了一个通用的buffer类型ByteBuf类。他与java.nio.ByteBuffer类似,但是更加性能,对用户更友好和可扩展。

友好性

当你在调用java.nio.ByteBuffer.flip()时,有没有考虑为什么buffer没有包含所有的信息,他在ByteBuf 从不会发生,因为他有2个index,一个是读取,另一个是写入。

ByteBuf buf = ...;

buf.writeUnsignedInt(42);

assertThat(buf.readUnsignedInt(), is(42));

他拥有丰富的读取方法能更加方便的读取buffer的内容。例如,他拥有方法能读取无符号,有符号数字和字符串。

可扩展

你无法继承java.nio.ByteBuffer,但是你可以继承ByteBuf。一个抽象的实现可以为你带来方便,你可以基于他做自己的buffer实现,例如基于文件的缓存,buffer组合或者更加复杂的实现。

高性能

当一个新的java.nio.ByteBuffer 被分配,他的内容将以零字符串进行填充。零字符串填充会带来CPU和内存的消耗。通常buffer马上会被数据源填充,因此零字符串填充并不是最好的方式。

需要指出的是,java.nio.ByteBuffer是基于JVM内存收集的,他能在Heap内存工作的不错,但是直接内存访问就不行。从设计上说,直接内存访问通常会存活很长一段时间。因此,分配许多短时间直接内存buffer通常会导致OutOfMemoryError,而且,回收一个直接内存所使用的API通常不是很快。

一个ByteBuf的生命周期是基于他被引用的次数,当引用数为0,他底层的内存区(byte[] or direct buffer)将被回收,或者返回内存池。

Netty也提供一种buffer池的实现,并且不浪费CPU和内存来以零来填充。

ByteBufAllocator alloc = PooledByteBufAllocator.DEFAULT;

ByteBuf buf = alloc.directBuffer(1024);

...

buf.release(); // The direct buffer is returned to the pool.

然而,引用数并不是银弹。如果在他底层内存换回内存池之间,JVM就收集了buffer,内存泄漏最终会导致池的资源被耗尽。

为了帮助你调试内存泄漏,Netty提供了一个泄露检测机制能灵活的在你的应用性能和泄露报表之间权衡,更多信息,请参照Reference-counted-objects

Listenable futures and event loops

执行一个异步任务——调度一个任务,并在任务完成的时候得到通知,应该很普遍而且很方便。当java.util.concurrent.Future 出现,我们并没有激动很久。我们需要阻塞以等待任务完成通知。在异步编程,你需要指定任务完成,你做什么而不是被动等待结果。

io.netty.concurrent.Future是JDK Future的子类,他允许你添加listener,而且当future完成时,这个listener会被eventloop调用。

io.netty.util.concurrent.EventExecutor是继承自java.util.concurrent.ScheduledExecutorService的单线程event loop。你可以建立自己的event loop或者使用一个丰富功能的task executor。通常,你会建立多个EventExecutors来利用计算机的并行计算能力。

EventExecutorGroup group = new DefaultEventExecutorGroup(4); // 4 threads

Future> f = group.submit(new Runnable() { ... });

f.addListener(new FutureListener> {

public void operationComplete(Future> f) {

..

}

});

...

The global event loop

有些时候,你想要一个唯一的executor,他一直可用并且不需要生命周期管理。GlobalEventExecutoris是一个单线程的EventExecutor 他会在他的线程延迟启动,在没用需要执行的任务后停止。

Platform-dependent operations

注意这个功能只是内部使用,我们在考虑在有足够需求的情况下,再把他从internal包中移出。

io.netty.util.internal.PlatformDependent 提供依赖于平台和潜在不安全的操作。你可以认为他是一个在sun.misc.Unsafe 和其他依赖平台API的上面一个薄薄的层。

Other utilities

为了构建一个高效的网络应用框架,我们引入了一些工具,你能找到一些有用的。

Thread-local object pool

如果你的程序现在是长时间运行,而且需要分配许多同类型的短生命周期对象,你可以使用thread local对象池Recycler类。他减少了大量的内存垃圾,节省了内存的消耗和垃圾收集。

public class MyObject {

private static final Recycler RECYCLER = new Recycler() {

protected MyObject newObject(Recycler.Handle handle) {

return new MyObject(handle);

}

}

public static MyObject newInstance(int a, String b) {

MyObject obj = RECYCLER.get();

obj.myFieldA = a;

obj.myFieldB = b;

return obj;

}

private final Recycler.Handle handle;

private int myFieldA;

private String myFieldB;

private MyObject(Handle handle) {

this.handle = handle;

}

public boolean recycle() {

myFieldA = 0;

myFieldB = null;

return handle.recycle(this);

}

}

MyObject obj = MyObject.newInstance(42, "foo");

...

obj.recycle();

User-extensible enum

对于一些静态的变量,enum非常适合,但是你无法继承他。当你需要在运行时增加更多的变量或者允许第三方定义更多的变量,考虑使用io.netty.util.ConstantPool

public final class Foo extends AbstractConstant {

Foo(int id, String name) {

super(id, name);

}

}

public final class MyConstants {

private static final ConstantPool pool = new ConstantPool() {

@Override

protected Foo newConstant(int id, String name) {

return new Foo(id, name);

}

};

public static Foo valueOf(String name) {

return pool.valueOf(name);

}

public static final Foo A = valueOf("A");

public static final Foo B = valueOf("B");

}

private final class YourConstants {

public static final Foo C = MyConstants.valueOf("C");

public static final Foo D = MyConstants.valueOf("D");

}

Netty使用ConstantPool 来定义ChannelOptions,所以非核心的transports可以以安全的方式定义transport相关的选项。

Attribute map

使用io.netty.util.AttributeMap 接口来定义一个快速,类型安全,线程安全的key-value集合。

public class Foo extends DefaultAttributeMap {

...

}

public static final AttributeKey ATTR_A = AttributeKey.valueOf("A");

public static final AttributeKey ATTR_B = AttributeKey.valueOf("B");

Foo o = ...;

o.attr(ATTR_A).set("foo");

o.attr(ATTR_B).set(42);

就像你已经知晓的,AttributeKey 是一个常量。

Hashed wheel timer

HashedWheelTimer是一个可扩展的,可用于替代java.util.Timer 或者java.util.concurrent.ScheduledThreadPoolExecutor。他可以处理许多计划的任务,并且他很容易取消任务。

foo

Schedule a new task

Cancel a task

HashedWheelTimer

O(1)

O(1)

java.util.Timer and ScheduledThreadPoolExecutor

O(logN)

O(logN) where N = number of pending tasks

在它的内部,使用一个Hash Table,大多数timer的操作,Hash Table的主键存放调度任务到yield的常数时间(it uses a hash table whose key is a task’s timing to yield constant time for most timer operations)。(java.util.Timer 使用二进制堆。)

下面的类也非常有用,但是你可以在其他类例如Guava中找到类似的。

io.netty.util.CharsetUtil 提供常用的java.nio.charset.Charsets

io.netty.util.NetUtil 提供常用的基于网络的常量例如IPv4和IPv6的回送地址。

io.netty.util.DefaultThreadFactory 是一个通用的ThreadFactory 实现,方便你配置线程池。

与 Guava and JDK8 的比较

因为Netty设法最小化依赖,它的许多工具类与其它的常用库类似,例如Guava。

这样的库提供了多样的工具类和其它的数据类型,这使我们使用JDK少些痛苦,而且这样的库也做的不错。

Netty关注于提供

异步编程

底层操作

堆外内存访问

访问底层进行操作

平台独立操作

Java有时采取并加入了Netty的一些类。例如,JDK 8 加入了CompleteFuture,这与io.netty.util.concurrent.Future相重叠,在这样的情况下Netty提供了很好的移植方式。在API的开发上,我们考虑移植性。

http://www.lbrq.cn/news/1367767.html

相关文章:

  • 青羊区定制网站建设报价/惠州seo博客
  • 杭州网站建设及推广/百度官网推广平台
  • 网站怎么做精准引流/百度云app
  • 网站建设需要的费用/搜索引擎优化免费
  • 贵州软件开发 网站开发/竞价恶意点击报案
  • 印刷网站建设 优帮云/网络营销网站建设案例
  • 文件包上传的网站怎么做/石家庄网站建设公司
  • 营销型网站重要特点是/全网营销推广怎么做
  • 专门做校招的网站/哪个模板建站好
  • 做网站用什么语言好/外贸网站平台都有哪些
  • 营销型高端网站建设价格/网络营销与直播电商怎么样
  • 苏州党员两学一做网站/厦门人才网唯一官网招聘
  • 1.申请网站空间/在哪里可以做百度推广
  • 漳州城乡住房建设部网站/网站推广软件
  • nh网站建设/网络上如何推广网站
  • 南京做网站南京乐识专注/郑州关键词优化费用
  • 通知中心app下载/西安网络推广seo0515
  • 网站建设网站设计/百度网页游戏中心
  • 网站优化方式有哪些/如何自己做推广
  • 自己做的网站如何制作后台/国外网络推广
  • 怎么做flash网站/深圳百度首页优化
  • dw如何做网站/宁波seo推广联系方法
  • 有多少做汽车的网站/宁波seo快速排名
  • 中山做展示型网站/购物网站
  • 网站icp备案是什么/怎么做网站教程视频
  • 用div css做网站第一步/上海比较大的优化公司
  • 网站建设职位/爱站网关键词长尾挖掘
  • wordpress html代码/上海优化seo公司
  • 编程 毕业设计代做网站/win7优化大师下载
  • 免费做二维码网站/新手怎么引流推广推广引流
  • 介绍JAVA语言、介绍greenfoot 工具
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • Unix 发展史概览
  • 单位长度上的RC参数
  • 深入 Go 底层原理(六):垃圾回收(GC)
  • [ LeetCode-----盛最多的水]