java
爱上编程的小白
天道酬勤,奋发图强
展开
-
NIO网络编程底层逻辑分析
背景最近在复习Java NIO的网络编程部分,针对NIO的多路复用,产生了以下疑问:ServerSocketChannel如何被创建的Selector是如何创建的Channel注册到Selector上的背后,执行了哪些操作;注册的SelectionKey.OP_ACCEPT在哪里起到作用的selector.select()为什么会阻塞selector的selectKeys是如何被赋值的SocketChannel是如何被创建的基于以上疑问,写了一个Demo,单步调试详细了解NIO的网络编程原创 2020-06-12 14:49:17 · 474 阅读 · 0 评论 -
Java对象布局解析与实战
背景对于了解Java内存布局的Coder来说,Java对象内存布局主要由头信息+对象变量(引用或原生类型)+对齐组成,而对于数组会添加一个数组长度字段,主要由头信息+对象变量(引用或原生类型)+对齐组成。而对于对象头信息,包含了众多信息,包括synchronized的锁信息、类指针信息等,下面内容主要针对Java对象头信息,做详细的分析。对象头信息针对不同的操作系统,会有不同的对象头信息,下面分页32位操作系统和64位操作系统的不同布局32位虚拟机|------------------------原创 2020-06-04 17:30:36 · 237 阅读 · 0 评论 -
Netty中FastThreadLocal为什么比ThreadLocal快
背景近期在看netty源码,发现有个叫做FastThreadLocal的类,代码doc中写明此类的用途和ThreadLocal一样,都是维持线程独有的变量,但是速度会更快。于是产生了疑问:FastThreadLocal为什么比ThreadLocal更快?快在哪?基于这个疑问,对此做了性能测试,并基于此,分析了源码,找寻原因。性能测试在JDK中ThreadLocal主要用于多线程环境获取当前线程维护变量数据,用户不需要关心多线程的问题,因此用户在多线程的环境下也可以方便的使用它。以下测试内容基于考虑两种原创 2020-06-03 18:03:20 · 612 阅读 · 0 评论 -
基于JMH对Java NIO 零拷贝进行基准测试
背景Java NIO中引入了零拷贝的API,本文测试零拷贝与传统IO的性能差异,通过借助基准测试工具JMH进行测试测试用例简单些了一个JMH的实例,迭代100次,计算每次的平均时间import org.openjdk.jmh.annotations.*;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.RunnerException;import org.openjdk.jmh.runner.options.O原创 2020-06-01 17:55:23 · 234 阅读 · 0 评论 -
使用NIO编写服务端代码,客户端关闭后,服务端无限循环获取读事件
问题描述服务端代码如下:package com.ethan.nio;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.*;import java.nio.channels.spi.Selec原创 2020-05-27 13:50:24 · 855 阅读 · 1 评论 -
HashTable、HashMap、Synchronized、ConcurrentHashMap性能测试分析
目的本文目的是为了对HashTable、HashMap、SynchronizedMap、ConcurrentHashMap做一个性能测试,以比较理论与实践的差距方法首先我准备了一个Junit测试类,可以配置不同线程并发数,以及插入到Map中的数据量大小。具体代码如下:package com.ethan.juc.container;import org.junit.BeforeClass...原创 2020-03-31 02:11:30 · 388 阅读 · 0 评论 -
一文搞定Spring容器初始化方法栈调用栈
背景大家都知道Spring容器启动时,主要通过调用org.springframework.context.support.AbstractApplicationContext#refresh 方法,但是在调用过程中,有很多的调用链,分析起来很麻烦,出于这个目的,我打算写个小插件,Spring容器初始化的调用堆栈。思路有了这个背景后,就要思考怎么能打印出来调用的堆栈信息,接触的有两种方式通...原创 2020-03-18 16:43:40 · 449 阅读 · 0 评论 -
Java 线程池之 DelayedWorkQueue 使用及源码分析
参考:https://www.imooc.com/article/340831. 前言上一篇文章,我们详细的讲解了ScheduledThreadPoolExecutor,并给出了它与ThreadPoolExecutor的关系。ScheduledThreadPoolExecutor中有一个重点我们没有详细的介绍,那就是DelayedWorkQueue类,这个类实现了从队列中延迟取节点,...原创 2019-03-13 18:54:57 · 6198 阅读 · 1 评论 -
Java 线程池之 ThreadPoolExecutor 源码分析
Java 线程池源码分析(基于JDK1.8):ThreadPoolExecutor 是Java最常用的线程池,今天来分享下源码分析,以下是ThreadPoolExecutor具体类继承关系,以及方法详情我们看到ExecutorService接口,提供了submit(Runnable)、submit(Runnable,T)、submit(Callable<T>)三个接口方法,...原创 2019-02-26 11:46:01 · 332 阅读 · 1 评论 -
Java 线程池之 ScheduledThreadPoolExecutor 使用及源码分析
上一篇文章Java 线程池之 ThreadPoolExecutor 源码分析介绍了Java线程池的基本实现ThreadPoolExecutor是如何实现的,主要是通过将Runnable或Callable实现类,包装成FutureTask,然后在维护的workers线程池集合中某一线程中运行run()方法,启动线程。这里只是大致说下原理,具体可参考上篇文章中的分析。我们本篇是对线程池的续集,解说...原创 2019-03-04 14:07:07 · 683 阅读 · 0 评论 -
Java 线程池提交任务流程
Java 线程池ThreadPoolExecutor提交任务流程如下:流程解释为:当线程池新加入一个线程时,首先判断当前线程数,是否小于coreSize,如果小于,则执行步骤2,否则执行3 创建新线程添加到线程池中,跳转结束 判断当前线程池等待队列是否已满,若已满,则跳转至步骤5 加入等待队列,等待线程池空闲,跳转结束 判断当前线程数是否已达到maximumPoolSize,若...原创 2019-02-25 17:29:56 · 4177 阅读 · 0 评论 -
Minor GC VS Full GC触发条件
1. 首先编写基础代码,设置Java运行参数,打印出gc detail变化public class Main { public static void main(String[] args) throws Exception { }}运行Mainjava -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails...原创 2019-02-20 11:09:42 · 236 阅读 · 0 评论 -
Dubbo 源码解析系列一 ExtensionLoader
Dubbo作为阿里巴巴开源的RPC框架,也是业内被各大公司使用的最多的RPC框架,有些直接使用了Dubbo,有些对Dubbo进行改造,例如当当网使用的Dubbox。从本文开始,笔者将陆续介绍对Dubbo源码进行解析,本节从Dubbo中最为重要的ExtensionLoader开始讲起。原创 2016-12-06 23:49:35 · 349 阅读 · 0 评论 -
线程级别单例模式
作为一个程序猿,都应该知道单例模式,实现方式有很多种,懒汉式,线程不安全;懒汉式,线程安全;恶汉式;恶汉式,变种;静态内部类;双重检验锁;登记式。这些方式各有各的好处,这些在网上都可以搜索到很多,以上这些都是进程级别的单例模式。原创 2016-12-06 23:46:04 · 991 阅读 · 1 评论