浅析零拷贝技术

作者:Truman's Blog 来源:http://trumandu.github.io/2019/06/14/浅析零拷贝技术 前言 零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。 零拷贝操作减少了在用户空间与内核空间之间切换模式的次数。 举例来说,如果要读取一个文件并通过网络发送它,传统方式下如下图,传统的I/O操作进行了4次用户空间与内核空间的上下文切换,以及4次数据拷贝。 »

JVM深入理解-垃圾回收

前言 最近线上出现了JVM 频繁FGC的问题,查询了很多GC相关的资料,做了一些整理翻译。文章比较长可以收藏后慢慢阅读。 一、什么是垃圾回收?(Garbage Collection) 一个垃圾回收器有一下三个职责 分配内存 确保有引用的对象能够在内存中保留。 能够在正在执行的代码环境中回收已经死亡对象的内存。 这里提到的有引用是指存活的对象,后面会提到一些算法用来判断对象是否存活。不在有引用的对象将被认为是死亡的,也就是常说的垃圾garbage。找到并释放这些垃圾对象占用的空间的过程就被称作是垃圾回收garbage collection。 垃圾回收可以解决很多内存分配的问题,但并不意味这全部。 比如:你可以不断地创建对象并保持对它们的引用直到没有可用的内存分配。垃圾回收本身就是一项非常复杂和消耗资源的过程。 二、 »

Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设计以及请求是如何流转的,那么我们这篇博客聊聊Tomcat的异步Servlet,Tomcat是如何实现异步Servlet的以及异步Servlet的使用场景。 手撸一个异步的Servlet 我们直接借助SpringBoot框架来实现一个Servlet,这里只展示Servlet代码: @WebServlet(urlPatterns = "/async",asyncSupported = true) @Slf4j public class AsyncServlet extends HttpServlet { ExecutorService executorService =Executors.newSingleThreadExecutor(); @Override »

理解Linux用户态和内核态

Linux整体架构图 我们先来看一张Linux整体架构图。 系统调用 ​ 系统调用时操作系统的最小功能单位。根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-350之间。这些系统调用组成了用户态跟内核态交互的基本接口,例如:用户态想要申请一块20K大小的动态内存,就需要brk系统调用,将数据段指针向下偏移,如果用户态多处申请20K动态内存,同时又释放呢?这个内存的管理就变得非常的复杂。 库函数 ​ 库函数就是屏蔽这些复杂的底层实现细节,减轻程序员的负担,从而更加关注上层的逻辑实现。它对系统调用进行封装,提供简单的基本接口给用户,这样增强了程序的灵活性,当然对于简单的接口,也可以直接使用系统调用访问资源,例如:open( »

Shadowsocks自定义PAC规则

Shadowsocks PAC规则 ShadowSocks默认使用GFWList规则和使用adblock plus的引擎。要想自己添加自定义的用户规则,最好熟悉一下其规则: 中文版:Adblock Plus过滤规则 自定义代理规则的设置语法与GFWlist相同,语法规则如下: 通配符支持。 比如 *.example.com/* 实际书写时可省略 * , 如.example.com/ 和 *.example.com/* 效果一样 正则表达式支持。 以 \ 开始和结束, »

一直想搞懂的字符编码问题

背景 ​ 从你刚刚毕业开始最怕的问题就是乱码问题对不对?起码我是。后面渐渐的知道是编码问题,而后面为了出现这种问题就都选择UTF-8,然后后面渐渐的就开始淡忘了这个问题。然后当小弟弟小妹妹问我们这相关的问题的时候,也都是跟他们说,全部改成UTF-8就好了。 ​ 但这是一种逃避,其实编码问题困扰我好多年,其实说句实话,真的没有搞懂。之前还有同事在一起相互考问 一个中文到底占用几个字节? 对不对,你遇到过吗?你回答的上来吗?哈哈 推荐几个常用的地址: ASCII:http://tool.oschina.net/commons? »

ArrayList与CopyOnWriteArrayList常见操作与问题

ArrayList循环遍历并删除元素的常见陷阱 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。不妨把这个问题当做一道面试题目,我想一定能难道不少的人。今天就给大家说一下在ArrayList循环遍历并删除元素的问题。首先请看下面的例子: import java.util.ArrayList; public class ArrayListRemove {   publicstaticvoidmain(String[]args)   {     ArrayList<String>list=newArrayList< »

MySQL的执行计划与代价模型详细解析

背景 为了后续的沟通方便,在20200213的早上创建了一个《简栈-Java技术交流群》,也方便大家通过扫二维码积极的参与进来。 如果是二维码已经过期,大家可以添加简栈文化-小助手的微信号(lastpass4u),然后让他拉大家进群进群。我们保持着小而美的精神,宁缺毋滥。 然后早上群里就有人提了一个问题: 执行计划里面的扫描函数跟执行时间不匹配,比如查询优化器发现,扫描a索引行数更多,所以更慢,因此优化器选择了索引b, 但实际上走b索引的时候比a更慢,走a索引大概是4秒左右,b是8秒。 这个问题激发起了大家的讨论,有的人建议说: 1、这种可以强制指定索引执行的吧 2、这个扫描行数都是预估的不一定准的, »

聊聊Java内省Introspector

作者:throwable 来源:http://www.throwable.club/2019/12/25/java-introspector-usage/ 前提 这篇文章主要分析一下Introspector(内省)的用法。Introspector是一个专门处理JavaBean的工具类,用来获取JavaBean里描述符号,常用的JavaBean的描述符号相关类有BeanInfo、PropertyDescriptor,MethodDescriptor、BeanDescriptor、EventSetDescriptor和ParameterDescriptor。下面会慢慢分析这些类的使用方式,以及Introspector的一些特点。 JavaBean是什么 JavaBean是一种特殊( »

Java volatile关键字解析

作者:薛8 来源:https://ddnd.cn/2019/03/19/java-volatile/ volatile简介 volatile被称为轻量级的synchronized,运行时开销比synchronized更小,在多线程并发编程中发挥着同步共享变量、禁止处理器重排序的重要作用。建议在学习volatie之前,先看一下Java内存模型《什么是Java内存模型?》,因为volatile和Java内存模型有着莫大的关系。 Java内存模型 在学习volatie之前,需要补充下Java内存模型的相关(JMM)知识,我们知道Java线程的所有操作都是在工作区进行的,那么工作区和主存之间的变量是怎么进行交互的呢, »