自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 从0开始在macbook上安装jupyterbook

本篇文章介绍的是如何从0开始在mac上安装jupyterbook,读者可能不需要从零开始,只需要检查哪一步遗漏了,从遗漏的地方开始安装即可。首先安装python3安装 homebrew/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"官网:https://brew.sh/brew install python检查是否安装成功 python3 -

2021-10-03 19:19:32 733 1

原创 【社畜随想】没有工作的一年里我想了些什么

为了让这篇随想看起来不是那么随便,我先介绍一下我这有点复杂的情况。我有一份在国外写代码的工作,但是19年底想回家过年,结果正好赶上疫情爆发就没法出去工作了,公司也保证会保留我的工作岗位,保险也给交着,身份也能被保留。所以虽然没法工作对职业生涯的发展有影响,但作为反内卷新晋人士的我压力也没有那么大。背景汇报完毕,下面就让我先说说没有工作的这一年里读杂书的一些小感想,还有一些神经突触乱放电导致的一些胡思乱想,可能对工作没有什么帮助,但确是我工作到现在最大的一笔财富。首先是工作相信对大多数人来说,工作是痛

2021-10-02 17:54:56 267

原创 【ZooKeeper系列】(1)集群协调员——ZooKeeper

本文会对ZooKeeper进行一个简要的介绍,包括它的工作形式以及原理。

2021-05-24 14:05:29 230 1

原创 【ZooKeeper系列】(2)ZooKeeper的安装与使用

本文通过四台linux虚拟机,介绍如何配置一个ZooKeeper集群,并且一些ZK的基本使用。

2021-05-24 13:55:23 280

原创 Linux环境下JDK的安装

本文介绍如何在linux环境中安装jdk。通过scp命令将oracle官网的jdk安装包传输进虚拟机中,然后解压、加入系统路径的方式。

2021-05-24 09:53:53 134

原创 【redis系列】(六)redis集群搭建——从AFK原则Y、Z轴讲起

本文讲解搭建redis集群的一些理论基础,探讨如何将数据散列到不同的redis节点上,包括将redis当做缓存和当做分布式数据库两种情况。从AFK原则上来说,是向Y轴和Z轴进行拓展。

2021-05-20 09:51:40 651 1

原创 【redis系列】(五)redis集群搭建——从AFK原则X轴讲起

本文介绍redis集群在AFK原则X轴上的拓展。并且通过实操来搭建一个简单的redis集群,每个节点都包含相同的数据。

2021-05-18 18:46:48 458

原创 【redis系列】(四)数据的持久化

redis将数据放在内存中以保证性能,但同时也是问题的来源。内存中的数据会因为断电而永久丢失,所以将这些数据持久化就非常重要了。本文来介绍redis提供的两种持久化的方法——RDB与AOF。

2021-05-17 11:18:03 143

原创 【redis系列】(三)redis的API介绍

redis除了这些不同类型的value,还有其他值得注意的地方。本文就会介绍几种今后可能会用到的几个特性,包括管道,订阅/发布,事务以及缓存淘汰机制

2021-05-16 21:52:29 771

原创 【redis系列】(二)redis中五种value类型与其常用方法

本文主要介绍在命令行中,如何使用redis的五种不同类型的value,分别是字符串,散列,列表,集合与有序集合。

2021-05-07 10:52:52 3823

原创 【redis系列】(一)redis的安装与环境配置

介绍redis在linux环境下如何安装,并且配置为一个服务。

2021-05-01 10:11:26 365 1

原创 【网络IO】(三)多路复用器由单线程到多线程的演进之路

在单线程的环境下,所有的socket都是被线性处理的,如果一个socket处理的时间很长,就会影响之后socket的处理。为了提高网络IO的效率,必须要将多路复用器在多线程环境下应用起来。本文首先提供一个简单的单线程多路复用器代码,然后慢慢将它向多线程迭代。在这个过程中会出现两种不同的多线程解决方案——一个多路复用器版本和多个多路复用器版本。然后会通过代码来说明哪种方案更好。

2021-04-29 11:41:15 238

原创 【网络IO】(二)多路复用器——内核级介绍

我们介绍过的两种IO模型中,各有各的缺陷。BIO将系统资源浪费在了线程调度上,而NIO将系统资源浪费在了用户态与内核态的切换上。多路复用器解决了这两种IO模型的问题。

2021-04-27 18:32:03 851

原创 【网络IO】(一) socket、BIO与NIO

本篇文章来介绍网络中的IO。网络其实就是主机之间的通信,既然要通信,那就涉及到数据的接收与发送,这一部分就需要IO的参与。但网络中的IO跟单机中的IO又有区别,网络IO是要将两台机器通过互联网连接起来。这种连接就是通过socket实现的。本文会首先介绍socket的建立过程,然后会介绍两种linux内核与socket交互的两种模型——BIO与NIO。

2021-04-23 22:40:10 528 1

原创 Linux的虚拟文件系统与文件IO

本篇文章来介绍Linux中的文件系统。相信大家都听过这么一句话,在Linux系统中,“一切皆文件”。也就是说,你能想到的计算机中的任何东西,在linux中都可以映射成文件,比如线程、硬件等等。既然一切皆文件, 那么操作系统中的信息交流就是通过文件的交流完成的。

2021-04-22 22:36:10 218

原创 【高并发与负载均衡】LVS集群搭建实践

本文通过实操来介绍如何搭建LVS集群

2021-04-20 22:10:07 283

原创 【高并发与负载均衡】单点故障的答案——KeepAlived简介

本文会先分析LVS存在的问题,然后首先看看对于这些问题,我们根据常识有没有解决的思路。然后引出这篇文章的主角——KeepAlived,对比着看它解决问题的思路。

2021-04-19 22:30:25 498

原创 【高并发与负载均衡】LVS技术解析

前言当我们谈起互联网的时候,我们会想到什么?高并发一定是可以想到的关键词之一。而高并发带来的流量压力也是我们不得不去解决的问题。因为单台计算机根本处理不过来高并发的请求,所以我们需要一个计算机集群,而集群的“入口”,应该是一台只负责向每台计算机分发任务的“分发器”。对这台分发机,我们有什么要求?就是它的分发一定要快。LVS就是这样一种技术,它的全称是Linux Virtual Server。先看看下面这张图LVS仅仅负责将接收到的数据包转发给后台实际处理的服务器。而且它的转发速度特别快

2021-04-17 10:21:50 361

原创 TCP/IP五层协议——数据包是如何到达服务器的

前言如果要在互联网领域深耕,就不得不去了解网络是如何运行的,本文就会从一个数据包的流动,来简析一下网络的运行原理。而在工业界,提起网络,就不得不提TCP/IP协议。这个协议是事实上的互联网运行标准。本文会根据TCP/IP五层协议来介绍网络。首先我们需要记住这张图网络就像我们平常交流,只有双方都在一个“频道”上,交流才能完成。在网络中,我们用各种协议来让双方在一个频道上。并且这些协议是分层执行的,由上至下依次是应用层、传输控制层、网络层、链路层和物理层。每一层负责自己的工作,共同合作完成了一

2021-04-16 17:56:12 1182

原创 JVM调优那些事(五)调优实战以及常用参数一览

前言在本系列之前的文章中我们已经做了足够多的知识铺垫,现在就可以进入真正的调优实战阶段了.而所谓调优,不过是指下面两点:根据需求进行JVM规划与预优化。解决JVM运行过程中出现的各种问题,比如OOM,系统资源占用率飙高等。调优的核心就在于通过合适的JVM参数,使用合适的垃圾回收器来使JVM达到业务场景内的最佳性能。本文首先会介绍JVM调优的两个方面——规划与解决问题,随后会介绍几种常见的GC日志。最后会提供一些JVM调优常用的参数。调优实践调优的前置知识吞吐量:用户代码的执行时间/(用

2021-04-14 10:59:57 297

原创 JVM调优那些事(四)G1与三色标记算法

前言在之前的这篇文章中,我们已经介绍了几种常见的垃圾回收器的组合。这些垃圾回收器虽然实现上各有不同,但有一点是相同的——都是基于物理上的内存分代模型。也就是内存中青年代和老年代的比例都提前固定了,并且必须是连续的内存地址空间。但随着内存的不断变大,任何已经介绍过的垃圾回收器都很难在特别大的内存中保证性能。传统的垃圾回收器的内存模型已经很难跟得上硬件的发展了,这个时候就需要介绍一个新的垃圾回收器——G1垃圾回收器。G1垃圾回收器打破了之前物理内存分代的传统模型,通过将内存分为大小相同的小单元进行管

2021-04-13 22:27:52 928 1

原创 JVM调优那些事(三)常见的垃圾回收器

前言在本系列的前两篇文章,已经讲过了内存的垃圾回收方法以及内存的分代模型,但真正把它们整合起来,做具体垃圾回收工作的,还是垃圾回收器。随着工业界内存的不断扩大,垃圾回收器也已经更新了好几个世代。本文就会对市面上常见的几个垃圾回收器进行介绍,常用的垃圾回收器介绍首先来看这张图图中一共有八种垃圾回收器。除了G1 和 ZGC以外,其他的垃圾回收器都是基于内存分代模型的。有些垃圾回收器是在YGC(Young Garbage Collection)中被触发,而有一些垃圾回收器是在FGC(Full G

2021-04-12 21:05:25 139

原创 JVM调优那些事(二)JVM内存分代模型

前言在本系列的第一篇文章中,我们已经聊过关于内存垃圾的回收问题了。但是我们对不同的对象,采用的回收策略也应该有所不同。比如刚创建出来的对象更有可能被回收,而已经存在了很久的对象很有可能继续存在下去。那么对所有的内存中的对象采用一样的回收态度就会造成资源的浪费。JVM内存分代模型就出现了,就是将内存分为年轻代和老年代,刚刚创建的对象被分配进年轻代内存中,而存在比较久的对象则被分配进老年代内存中,其中年轻代的内存会更频繁的触发垃圾回收。下面我们就来更详细的介绍一下这个内存分代模型。内存分代模型在

2021-04-12 17:29:48 151

原创 JVM调优那些事(一)垃圾扫描与清除

前言这篇文章我们来讲讲JVM调优那些事儿。JVM调优主要是指优化JVM中的垃圾回收机制。制约JVM运行速度的,就是可运行的内存空间,如果内存空间被大量的垃圾占据,那么JVM的运行速度就会不可避免的降低。本文首先会从内存垃圾入手,垃圾(Garbage)在JVM中,我们对内存垃圾的定义很简单:内存中没有引用指向的对象。JVM 是如何找出垃圾的呢,这里有两种垃圾标记方法。垃圾标记方法前面我们已经说过,所谓的垃圾就是没有引用指向的对象。那么JVM是用什么方法定位到这些垃圾的呢?主要就是与下面这两种

2021-04-12 10:56:30 297

原创 java 虚拟机浅析(四)JVM运行时栈空间的内部状态解析

前言本文主要介绍JVM运行时,内存中数据的布局情况,主要是介绍JVM栈的状态更迭。本文会通过查看一个类文件编译后的字节码文件,来分析当一个方法执行的时候,JVM中的栈空间所发生的变化。JVM内存的整体布局当JVM运行时,内存主要由程序计数器(Program Counter),栈(stack),直接内存区(Direct Memory),方法区(Method Area),堆(Heap)。栈又可以分成两部分,分别是JVM Stack和Native Method Stack。每个线程都有自己独立的程序计

2021-04-03 13:28:25 242

原创 java 虚拟机浅析(三)Object的底层结构

本篇文章介绍java中的**对象**的底层存在形式,由哪些部分组成,每部分的大小等等。java中有两种对象的底层结构,分别是**普通对象**和**数组对象**。

2021-04-02 16:55:33 394

原创 java 虚拟机浅析(二)JVM是怎么加载class文件的

前言这篇文章已经介绍过JVM是跟class类型的文件发生交互的。本篇文章就要介绍JVM是如何将硬盘中的class文件加载到内存中的。

2021-04-01 17:16:09 213

原创 java 虚拟机浅析(一)从HelloWorld.java是怎么跑起来的讲起

前言本篇文章是介绍JVM(Java Virtual Machine)的第一篇,主要对JVM进行一个简要的入门介绍。本文会从一个java程序讲起,从JVM的视角来分析这个程序从.java文件到机器可以识别的机器码中间到底经历了什么。从我们人生中第一个java程序讲起在我们初学java的时候,除了Hello World,还有两个命令是一定要学的——分别是javac和java命令。举个例子,我们当初可能编写了下面这个HelloWorld.java文件:// HelloWorld.javapublic

2021-03-31 20:47:49 180

原创 Java多线程系列(六)池化思想的优秀代表——线程池

前言本文介绍java多线程最不可缺少的一环——线程池。说到线程池,就不得不提池化思想了。池化思想的核心就是复用。如果我们不用线程池,而是自己创建Thread对象来运行任务,系统就会不断的创建和回收Thread对象,而这其中必然会造成系统效率的下降和资源的浪费。但是如果我们提前准备了一些空闲的Thread对象,需要的时候直接拿来用,用完了再把空闲的Thread对象存起来以备下次使用。这样就避免了系统临时创建线程和回收线程所产生的资源浪费。这就是线程池的由来。本文会从学习线程池所需要的前置知识入手,

2021-03-29 18:06:34 245

原创 线程池的核心——BlockingQueue

前言本篇文章会介绍BlockingQueue的概念。BlockingQueue是java线程池的核心。无论是在面试还是工作中,都是必知必会的知识点。BlockingQueue的名字就完美概括了这个接口的特点,Queue 是BlockingQueue的父接口,说明它本质还是一个队列。Blocking意为阻塞,说明BlockingQueue相对于普通队列,新增了阻塞的特性。本文会从BlockingQueue的父接口Queue开始聊起,包括Queue在java 容器中的定位以及API等等。然后介绍Bloc

2021-03-28 17:18:14 1064

原创 Java多线程系列(五)ThreadLocal 源码级理解

本文从源码角度来理解threadLocal

2021-03-27 17:43:13 87

原创 java的四种引用类型——强软弱虚

前言我们都知道,java的数据类型有两种,分别是基础数据类型和引用数据类型。而面向对象编程中的“对象”,就是引用数据类型。由此可见,引用在java语言中可谓是无处不在。而“引用”只是一个很笼统的提法,根据在GC(垃圾回收)中的表现不同,可以分成“强软弱虚”四种类型。下面我们通过代码示例来演示,四种引用类型在GC下的不同表现。由于四种引用类型主要是在垃圾回收过程中会表现出不同,我们先准备一个测试类,这个类的实例在被回收的时候会执行一句打印语句。public class TestObject {

2021-03-26 21:45:48 184 1

原创 [源码阅读]AQS源码浅读——从ReentrantLock讲起

前言AQS, AbstractQueuedSynchronized, 是所有java中基于CAS实现的新类型的锁的基类,对java多线程来说,这个类至关重要。本篇文章尝试从源码的角度讲解一下AQS的加锁过程的实现原理。本文首先会从宏观的角度解释AQS的底层数据结构,然后从ReentrantLock加锁开始画出一个函数调用的时序图,最后根据时序图来分析每个函数的作用。AQS的数据结构AQS的数据结构,简单来说就是一个由volatile修饰的int类型的变量,和一个线程等待队列,这个队列是个双向队列。

2021-03-26 10:15:28 79

原创 java中基于CAS的新的同步机制(六)LockSupport——从一道面试题说开去

前言这篇文章再来介绍一个基于CAS的新的同步机制——LockSupport。LockSupport实现了更方便的控制进程的阻塞与开启。想想之前我们是怎么控制线程的阻塞的?

2021-03-25 11:25:48 181

原创 java中基于CAS的新的同步机制(五)Semaphore

前言本篇文章同样是来介绍一个java中基于CAS的新锁——Semaphore。Semaphore,本意是信号的意思。这个类的作用是能够控制运行的线程个数,类似于限流器。或者可以把它理解成令牌发放器,获得令牌的线程才可以运行。比如同时有5个线程尝试通过Semaphore的某个实例,但是Semaphore只有两块令牌,只允许两个线程同时运行,那么同一时刻,只有两个线程运行,另外三个线程阻塞等待。本文将首先介绍一下Semaphore的用法,然后通过代码演示一下这个类具体是如何起作用的。Semaphore

2021-03-24 16:16:09 149

原创 java中基于CAS的新的同步机制(四)ReadWriteLock

前言阅读这篇文章,需要对读锁和写锁有一定的了解。共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。本篇文章来介绍ReadWriteLock,

2021-03-24 12:37:04 147

原创 java中基于CAS的新的同步机制(三)CyclicBarrier

前言本文介绍第三个java中基于CAS的新锁——CyclicBarrier。CyclicBarrier, 英文直译是“循环屏障”。重点在“循环”这里,有点像CountDownLatch,但CountDownLatch是一次性的,被推倒了就站不起来了。但是CyclicBarrier更像是被推到了,还能重新站起来,继续挡着。有一点与CountDownLatch不同的是,CyclicBarrier并不是执行countDown()的操作,而是看被阻塞的线程数量,当这个数量达到了指定的阈值,被阻塞的所有线程都会

2021-03-24 10:44:22 110

原创 java中基于CAS的新的同步机制(二)CountDownLatch

前言这篇文章介绍一个java中基于CAS的新的同步机制——CountDownLatch。CountDownLatch中的Latch有“门栓”的意思。它的作用就像门栓一样,阻塞当前线程的运行。但是门栓的强度也是有上限的,一旦冲击门栓的次数超过了上限,门栓就会“断开”,阻塞的线程也会重新运行。就像thread.join()方法,达到了阻塞当前线程,等待其他线程的作用。这篇文章就会讲解CountDownLatch的具体用法。CountDownLatch的用法构造函数参数CountDownLatch

2021-03-24 09:58:30 149

原创 java中基于CAS的新的同步机制(一)ReentrantLock

这篇文章来介绍java中基于cas实现的新锁——ReentrantLock

2021-03-23 21:18:16 289

原创 Java多线程系列(四)无锁优化——CAS操作

前言当我们说多线程的时候,似乎有个话题是绕不过去的——锁。锁确实可以让我们的多线程程序安全、准确的运行,但也不可避免的影响了我们程序的效率。毕竟加锁段的程序又成了单线程运行。为了解决锁带来的效率问题,“无锁优化”被提出来了,简而言之,就是不通过加锁的方式,实现多线程的安全、准确的运行。CAS, 全称 Compare And Set 就是一个无锁优化的方式。顾名思义,CAS 会先做比较,如果要改变的变量值与预期值相同的情况下,才会进行下一步操作。本篇文章就将介绍CAS,并且通过Demo程序简单对比一

2021-03-23 16:23:45 366

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除