农场主的黑科技.

农场主的黑科技.

Farmer's Hei ke ji :)

Netty源码剖析-总结
netty对JDK的NIO进行一系列的封装,下面总结netty中的一些概念,不涉及源码,源码解析部分在之前的博客中有记录. 常见问题 Boss线程就是服务端线程,用于管理ACCEPT事件,当发生ACCEPT事件时获取新连接的Channel在pipeline中进行传播 worker线程用于处理客户端,数量是默认的CPU*2个创建服务端Channel(Boss)时会把用于客户端的数据封装成ServerBootst...
Netty源码剖析-性能优化工具类2
轻量级对象池Recycler如果recycler中有对象就能复用,不用每次都去new. 基于FastThreadLocal好处: 减少内存使用 减少GC频率 Recycler使用示例程序: 1234567891011121314151617181920212223242526272829303132public class RecycleTest { private static final Recycler<User> RECYCLER = new Recycler<User>() { @Override protected User newObject(Handle<User> handle) { //没有对象可以拿出来直接用的时候. return new User(handle); } }; private static class User { private final Recycler.Handle<User> handle; public User(Recycler.Handle<User> handle) { this.handle = handl...
Netty源码剖析-性能优化工具类
FastThreadLocal Recycler FastThreadLocalFastThreadLocal的使用示例代码 12345678910111213141516171819private static FastThreadLocal<Object> threadLocal0 = new FastThreadLocal<Object>() { @Override protected Object initialValue() { return new Object(); }};public static void main(String[] args) { //两个线程 new Thread(() -> { Object object = threadLocal0.get(); // .... do with object System.out.println(object); }).start(); new Thread(() -> { Object object = threadLocal0.get(); // .... do with object System.out.println(object); }).start();} 与ThreadLocal相同,就算Thread中获取了同一个object,两个线程对这个object的更变都不会相互影响 示例的运...
Netty源码剖析-编码
如何把对象变成字节流,最终写到Socket底层? writeAndFlush() 重要的ChannelHandler biz:生成一个对象,调用writeAndFlush写出去 encoder:对该对象进行编码 示例代码12345678ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new Encoder()); ch.pipeline().addLast(new BizHandler()); }}); 这里定义的BizHandler如下: 1234567public class BizHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { User ...
Netty源码剖析-解码
解码:把一串二进制数据流解析成ByteBuf 解码器抽象的解码过程 netty里面有哪些拆箱即用的解码器 本章内容 解码器基类 netty中常见的解码器分析 解码器基类ByteToMessageDecoder解码步骤所有底层解码器都基于它实现 解码步骤: 累加字节流 调用子类的decode方法进行解析 将解析到的ByteBuf向下传播 1.累加字节流 如果是第...
Netty源码剖析-ByteBuf-总结
ByteBuf实在是复杂,这篇总结一下源码剖析中的概念. ByteBuf的结构1234567* +-------------------+------------------+------------------+* | discardable bytes | readable bytes | writable bytes | 无效的 可以读的空间 可以写的空间* +-------------------+------------------+------------------+* | | | |* 0 <= readerIndex <= writerIndex <= capacity ByteBuf中三个重要的指针 readIndex..表明读数据从这个指针开始 writeIndex..表明如果要写数据的话就从这个指针...
Netty源码剖析-ByteBuf-3
subpage级别的内存分配:allocateTiny()步骤 定位一个Subpage对象,基于一个page.可能是用已有的subpage,也可能是新创建的 如果是新创建的subpage,初始化Subpage.初始化过程,去chunk里找一个page.把这个page按照期望的subpage大小进行划分如:期望1K的内存 ,把8K的Page分成8份 初始化pooledByteBuf.其实就是拿到内存信息,放入到一个bytebuf中 下面使用16B进行测试 代码片...
Netty源码剖析-ByteBuf-2
内存规格介绍netty中常见的内存规格 Chunk 16M对应一个Chunck,内存申请是以Chunk为单位进行,之后的内存分配都是在申请到的Chunk中进行操作 如:想申请1M的内存:去申请16M的Chunk,再从这里面取出1M的连续内存分配给一个ByteBuf Page8K对应一个Page如:想申请16K的内存,但会得到16M的Chunk,把这个Chunk进行切分,此时以Page为单位.然后取2个连续的Page1...
校招准备视频笔记-高级知识点
并行计算 多线程 资源管理 并行计算并行计算的方法 将数据拆分到每个节点上 每个节点并行的结算出结果 将结果汇总 例:外部排序如何排序10G个元素?元素的一部分存储在外部,磁盘上 扩展的归并排序归并排序: 将数据分为左右两半,分别归并排序,再把两个有序数据归并 进行切分成多个节点,&...
校招准备视频笔记-设计模式
设计模式简介 再谈Singleton 变继承关系为组合关系 如何创建对象 Singleton优缺点 确保全局最多只有一个对象. 用于:构造缓慢的对象,需要统一管理的资源 缺点:很多全局状态,线程安全性 Singleton的创建 双重锁模式 ,在并发环境下使用 作为Java类的静态变量,也就是饿汉式,缺点在于类加载时就会被创建,浪费资源 ...
avatar
nnkwrik
做自己喜欢做的事!呱!