
Java基础
文章平均质量分 82
尐葮阿譽
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Docker中部署flink集群的两种方式
本文将通过 2 种方式在 docker 中部署 flink standalone 集群,集群中共有 4 个节点,分别是 1 个 jobManager 节点和 3 个 taskManager 节点。方式一能快速部署一个 flink 集群,但是使用的是默认配置,不够灵活,方式二使用的是外置配置文件,可以灵活控制集群配置。原创 2024-02-19 14:50:39 · 1898 阅读 · 0 评论 -
由SoftRefLRUPolicyMSPerMB=0引起的频繁Full GC问题排查实战
这段代码的意思是,每次调用invoke方法实际上都是调用的invoke0本地方法,但是调用本地方法会有一点性能损耗,于是JVM做了一个优化,当numInvocations的值大于inflationThreshold时,生成一个动态类,然后每次调用invoke方法就直接调用动态类对象的invoke方法,而不再调用本地方法,也就是说同一个方法的反射调用次数超过15次(默认值)后,就动态生成一个反射相关的类,后面直接调用生成类对象的invoke方法即可。...原创 2022-08-02 00:35:18 · 1429 阅读 · 3 评论 -
Java IO 底层原理
引言一提到 IO,就绕不开对 page cache(页缓存)的讨论,页缓存是操作系统为了提升磁盘读写性能在应用进程与磁盘之间加设的提供预读和异步刷盘机制的内核缓冲区。java 的 IO 操作是建立在操作系统的 IO 之上的,从最基础的 read/write 系统调用,到具有零拷贝特性的 sendfile、mmap,在 java 中都能看到它们的身影。本文的主要目的是纵观全局,鸟瞰 java IO 体系,并指出每种 IO 方式的特点与使用场景。整篇文章会围绕下图作分步讲解,为了简单起见,这里主要以写操作为例原创 2020-07-01 08:38:24 · 2822 阅读 · 6 评论 -
RandomAccessFile、FileChannel和MappedByteBuffer
一、RandomAccessFile简单示例:import java.io.IOException;import java.io.RandomAccessFile;/** * @author debo * @date 2020-06-27 */public class RandomAccessFileTest { public static void main(String[] args) throws IOException { RandomAccessFile原创 2020-06-28 00:28:14 · 2819 阅读 · 1 评论 -
聊一聊volatile的可见性和有序性
众所周知,volatile无法保证原子性,但是可以保证可见性和有序性,今天就结合实际案例聊一聊volatile的可见性和有序性,同时详细说一下happens-before原则中关于volatile的部分,最后说一下稍带同步的概念。1、可见性基于对JMM的了解,线程从主内存中加载变量(比如实例变量)副本到自己的工作内存,后面使用的都是工作内存中的值,在单线程环境下,这是没有问题的。但是,在多线程...原创 2020-04-26 19:28:38 · 882 阅读 · 0 评论 -
详述DirectByteBuffer直接内存
什么是直接内存我们都知道Java程序是运行在Java虚拟机中的,Java对象的分配一般情况下是在虚拟机的堆内存空间,俗称堆内内存。这一块的内存垃圾回收是受JVM控制的,程序员无需为此处的内存回收而操心。Java对象除了能分配在堆中,也能分配在堆外,这部分内存叫堆外内存,也就是直接内存。直接内存和堆内内存的比较堆内内存的分配是在JVM中,因此分配速度很快,但是堆内内存在进行网络I/O的时候,需...原创 2020-02-12 23:30:54 · 884 阅读 · 0 评论 -
ClassLoader双亲委派机制在Java SPI中的应用
概述Java SPI机制指的是java来定义接口,然后由不同的厂商去实现这个接口,比如数据库的驱动程序就是由不同厂商实现的,MySQL的驱动和Oracle的驱动是不同的,但是它们都实现了java.sql.Driver接口。下面就来探索程序中如何去获取这个具体实现以及类加载器的双亲委派机制在其中的作用。Java SPI示例1、实现服务假设java.lang.Runnable是一个服务,需要各...原创 2020-01-28 22:30:17 · 650 阅读 · 0 评论 -
PhantomReference虚引用
示例代码如下:import java.lang.ref.PhantomReference;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;/** * @author chenjc * @since 2020-01-13 */public class PhantomReferenceTest {...原创 2020-01-13 17:15:25 · 474 阅读 · 0 评论 -
WeakReference弱引用
示例代码如下:import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.ref.WeakReference;/** * @author chenjc * @since 2020-01-13 */public class WeakReferenceTest { p...原创 2020-01-13 17:13:42 · 483 阅读 · 0 评论 -
SoftReference软引用
示例代码:import java.lang.ref.SoftReference;/** * @author chenjc * @since 2020-01-13 */public class SoftReferenceTest { /** * 使用JVM参数-Xmx10m运行程序 * * @param args * @throws I...原创 2020-01-13 17:11:03 · 1042 阅读 · 0 评论 -
Docker中安装redis cluster集群
一、新建一个docker桥接网络# 创建名称为redis-cluster-net的桥接网络docker network create -d bridge redis-cluster-net二、部署redis节点参照我的这篇文章中的第二节,部署6个redis节点,绑定到宿主机的端口号分别为6391~6396,需修改的redis.conf配置如下#bind 127.0.0.1protec...原创 2020-01-08 17:05:58 · 847 阅读 · 0 评论 -
Docker中安装redis主从节点和sentinel集群
一、准备工作需要先创建一个docker网络,类型为桥接网络,后面会将redis主从节点和sentinel集群都加入到这网络中,目的是保证全部节点的相互连通。# 创建名称为redis-net的桥接网络docker network create -d bridge redis-net注:其实可以不用特意创建一个网络,默认所有节点会自动加入到名称为bridge的桥接网络中,这个网络是默认已存在...原创 2020-01-03 16:57:00 · 689 阅读 · 0 评论 -
java数字签名
RSA非对称加密算法在作加解密的时候用公钥加密,私钥解密;在作数字签名的时候用私钥签名,公钥验证签名。下面就写一个java数字签名的工具类package cn.cjc.sign;import org.apache.commons.codec.binary.Base64;import org.junit.Test;import java.net.URLDecoder;import java.net原创 2017-06-25 11:09:32 · 1114 阅读 · 0 评论 -
java加密和解密
这里以RSA非对称加密算法为例,公钥和私钥是用文章java数字签名中的工具类生成package cn.cjc.sign;import org.apache.commons.codec.binary.Base64;import org.junit.Test;import javax.crypto.Cipher;import java.net.URLDecoder;import java.net.原创 2017-06-25 14:21:30 · 1044 阅读 · 0 评论 -
SynchronousQueue队列的使用
一直知道java.util.concurrent.Executors#newCachedThreadPool()方法里面使用了SynchronousQueue队列,但是自己在项目中却找不到使用该队列的场景,今天看到这篇文章,于是意淫出一个使用场景:有一个线程数为1的线程池,每次只能并发执行一个任务,当同时有多个任务被提交到该线程池时,抛弃多余的任务,代码如下:import java.util.con原创 2017-07-16 12:17:54 · 1093 阅读 · 0 评论 -
通过零拷贝实现高效的数据传输
很多Web应用都会提供大量的静态内容,也就意味着需要从磁盘读取数据,然后将它们写入到响应socket。这看上去似乎需要很少的CPU活动,但是它有点低效:内核从磁盘读取数据,然后穿过内核—用户边界把它送往应用,接着应用再穿过内核—用户边界把它送回,并写入socket。事实上,在把数据从磁盘发往socket的过程中,应用扮演着一个低效的中间媒介。每次数据穿过用户—内核边界都需要被拷贝,这会消耗CPU以及翻译 2017-09-26 23:40:52 · 2309 阅读 · 0 评论 -
HTTP keep-alive详解
1.为什么要有Connection: keep-alive?在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这原创 2017-10-29 17:17:15 · 78118 阅读 · 14 评论 -
FutureTask的用法
FutureTask的常见用法就是将耗时的任务做异步执行,而当前线程继续执行自己的任务,然后在需要的时候调用FutureTask的get()方法同步获取结果。具体代码如下:package cn.cjc.ft;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;import java....原创 2018-07-29 16:48:51 · 1889 阅读 · 1 评论 -
有关Zero-Copy、MMap以及DirectByteBuffer的一切
有一个很常见的场景,比如需要将文件从磁盘上原封不动地发送到网络的另一端。这通过代码实现起来很简单:对于Java而言,你可以使用InputStream的某个实现类将文件一块块地读取到小的缓冲区(通常我们都将缓冲区大小设置为8KB),然后再将缓冲区数据输出到OutputStream中。更好的做法是你可以创建一个PipedInputStream实例,让它来管理缓冲区。但是,如果你的应用对性能有要求,那么...翻译 2018-11-04 13:57:05 · 2378 阅读 · 0 评论 -
最简单的主从Reactor多线程代码实现
代码基于主从Reactor多线程这一线程模型编写,加上客户端总共只有5个类。服务启动后,会创建一个主Reactor线程,负责接受新连接,4个从Reactor线程,负责I/O读写,另外还有一个线程池,里面有200个线程,负责具体的业务处理。使用方法:先运行Server类,再运行Client类,然后在Client端控制台输入信息并回车,就会接收到来自Server端的响应信息(可以认为是实现了ECHO...原创 2019-01-05 18:03:10 · 2550 阅读 · 0 评论 -
java多线程状态详解
java.lang.Thread类中有个内部枚举类State用来描述线程的各种状态,具体如下 public enum State { /** * 尚未启动的线程的状态。 */ NEW, /** * 可运行线程的线程状态。处于可运行状态的某一线程正在Java虚拟机中运行,但它可能正在等待操作系统原创 2017-06-18 21:47:05 · 1862 阅读 · 0 评论