- 博客(248)
- 收藏
- 关注
原创 查看JVM进程的内存情况
// DirectMemory.javapackage com.infuq.memory;import org.jctools.util.UnsafeAccess;import sun.misc.Unsafe;import org.openjdk.jol.info.ClassLayout;import org.openjdk.jol.vm.VM;import java.util.Scanner;public class DirectMemory { public static v
2022-04-16 14:42:45 4229
原创 Tomcat访问静态资源txt出现乱码
在访问Tomcat上的静态资源txt文件时,出现乱码修改apache-tomcat-8.5.35/conf/web.xml文件内容如下<mime-mapping> <extension>txt</extension> <mime-type>text/plain;charset=UTF-8</mime-type></mime-mapping><servlet> <servlet-nam
2022-01-06 23:26:47 641
原创 Selector.select()
Netty的底层依然是依赖于JDK的NIO . 开发NIO服务端的代码如下所示import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;public class Server { // 缓冲区的大小 priva
2021-12-07 12:01:02 2021
原创 文件 ... 阻塞
关于同步,异步,阻塞,非阻塞 这一类概念.真理也许只有一个,然而每个人处于不同的境界,对它的认知有对有错, 个人感觉,绝大多数人对它的认知都是错误或者不完整.以前看过一段话, 意思就是说, “对于一个观点, 说到它的时候, 两个人都懂, 但是真正深入讨论这个观点的时候, 两个人就开始吵架了”https://stackoverflow.com/questions/34041403/what-is-blocking-mode-in-javahttps://www.remlab.net/op/nonbl
2021-11-30 15:40:59 300
原创 使用自定义协议实现Python向Netty传输数据
本篇文章,自定义一个数据协议,通过Python语言,使用这个自定义的数据协议,将数据发送给Netty接收端.之所以使用两种不同的语言,也在说明,数据之间的传输与语言无关.只要发送端和接收端彼此遵守相同的协议即可.关于协议,无处不在,比如与网络相关的HTTP协议, 比如向Redis发送命令使用的RESP协议,比如Dubbo消费者和提供者之间的数据传输,比如RocketMQ消费者与服务端之间的消息传输,比如JVM中使用jstack命令获取堆栈信息时所使用的协议,等等. 它们之间必然会有一套相关的协议,用于数
2021-10-01 14:38:19 1073
原创 Java线程与内核线程
本篇文章探究下Java线程与内核线程的关系.在Java中,一个Java的线程对应一个内核的线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡.先通过一个简单的实验热热身import java.lang.Thread;public class Example { public static void main(String[] args) throws Exception { new Thread(new Runnable() { @O
2021-09-20 13:17:43 677
原创 通过Netty/Socket/C语言三种方式向Redis服务器发送命令
本文通过使用Netty,Java的Socket和C语言Socket这三种方式,基于RESP协议,向Redis服务器发送一个set命令.向Redis服务器发送命令,即与Redis服务器通信,必须基于RESP协议. 就好像在B站看2021苹果秋季发布会的视频底层数据传输必须基于TCP协议一样.RESP协议是一个简单的协议.它的协议格式如下*<number of arguments> CR LF$<number of bytes of argument 1> CR LF <a
2021-09-15 22:49:05 544
原创 Netty之线程唤醒wakeup [续]
在之前的Netty之线程唤醒wakeup文章中, 介绍了如何唤醒Netty中的监听线程. 接下来我们通过源码的角度,结合一些命令,看一下它的实现.// WakeUp.javaimport java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.
2021-09-14 01:01:06 271
原创 JVM中的监听信号的线程以及Unix域套接字通信的线程
【实验】package com.infuq.tmp;public class Main { public static void main(String args[]) { for (;;) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace();
2021-09-12 11:24:07 310
原创 Netty接收数据时一次读取多少字节以及读多少次
本篇文章介绍一下,Netty在接收到数据时,一次性读取多少字节.本篇使用Netty构建一个简单的服务端,使用Python构建一个简单的客户端,然后客户端向服务端发送数据,然后观察Netty每次读取的字节数.客户端代码如下import socketif __name__ == '__main__': client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080))
2021-08-26 04:29:58 2463 1
原创 Netty对象池
在平时工作中,听说和使用过连接池,线程池等.还有一种就是对象池,可以实现对象复用的功能.当然实现对象池的方式手段有多种,比如有一个公共的池子,所有需要对象的线程通过并发控制的方式从池子中获取对象,并发控制的同时伴随性能的损耗.那么Netty是如何实现对象池的呢? 先通过一段演示代码说起import io.netty.util.Recycler;public class Book { private String name; private final Recycler.Handle
2021-06-10 20:25:13 429 1
原创 Unsafe.putOrderedXXX系列方法详解(数组赋值的第二种方式)
在Netty中,IO线程用于存储任务的容器是MpscUnboundedArrayQueue类.所有对外的读写操作,都’委托’给IO线程来执行,非IO线程(比如业务线程)若要写数据,必须将写操作封装成一个任务,提交到IO线程的任务队列中.IO线程会择机执行任务队列中的任务,将数据写入到网络(实际只是写到TCP缓冲区). 那么这个任务队列就很重要了,它必须是高性能的. 在Netty以前的版本中,使用JDK的BlockingQueue实现这个任务队列,而Netty是一个追求性能极致的框架(不被规则和常规所束缚)
2021-05-27 17:13:35 1007 1
原创 操作中划线-开头的文件
操作中划线-开头的文件本例的文件名是 -xyz创建touch -- -xyztouch ./-xyz查看ls -i -- -xyzls -i ./-xyz删除rm -f -- -xzyrm -f ./-xyzrm `find . -inum 396482`find . -inum 396482 -exec rm -i {} \;注释:396482表示文件的inode值...
2021-05-18 14:45:30 262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人