- 博客(138)
- 资源 (23)
- 收藏
- 关注
原创 JVM 基础 - JVM 内存结构
本文主要对JVM 内存结构进行讲解,注意不要和Java内存模型混淆了。JVM 内存结构运行时数据区一、程序计数器1.1 作用1.2 概述二、虚拟机栈2.1 概述运行时数据区内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。 下图是 JVM 整体架构,中间部分就是 Java 虚拟机定义的.
2022-03-13 15:19:27 329
原创 JVM 基础 - Java 类加载机制
类的生命周期其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。类的加载: 查找并加载类的二进制数据加载时类加载过程的第一个阶段,在加载阶段
2022-02-26 09:16:23 311
原创 Kafka集群搭建
Kafka集群搭建1.1 下载解压Kafka 安装包官方下载地址:http://kafka.apache.org/downloads,本用例下载的版本为2.2.0,下载命令:# 下载wget https://www-eu.apache.org/dist/kafka/2.2.0/kafka_2.12-2.2.0.tgz# 解压tar -xzf kafka_2.12-2.2.0.tgz这里解释一下 kafka 安装包的命名规则:以kafka_2.12-2.2.0.tgz为例,前...
2022-02-21 01:19:28 1342
转载 zookeeper 集群环境
一、zookeeper 安装 通过 VMware ,我们安装了三台虚拟机,用来搭建 zookeeper 集群,虚拟机网络地址如下: hostname ipaddress subnet mask geteway 1、 master 192.168.146.200 255.255.255.0 192.168.146.22、 slave1 ...
2022-02-21 00:58:48 349
原创 ThreadLocalRandom——Random在大并发环境下的替代者
随机数随机数在科学研究与工程实际中有着极其重要的应用!简单来说,随机数就是一个数列,这个数列可能满足一定的概率分布,又获取其满足的分布并不为我们所知。数学方法产生随机数应该称之为“伪随机数”,只有使用物理方法才能得到真正的随机数!因此我们使用计算机产生的随机数都是"伪随机数"。那么计算机到底是怎么产生随机数的呢?这时就要提到随机数发生器了。随机数发生器我们高中的时候都学过数列的知识,上面提到随机数可以看成是一个数列,那么我们可以将随机数发生器看成是一个数列表达式。比如现在有下面两个随机说
2021-08-02 00:29:13 107
原创 InheritableThreadLocal使用详解
引子public class InheritableThreadLocalDemo { private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { threadLocal.set("mainThread"); System.out.println("value:"+t
2021-08-01 17:41:20 221
原创 ThreadLocal 其实很简单
什么是ThreadLocalThreadLocal有点类似于Map类型的数据变量。ThreadLocal类型的变量每个线程都有自己的一个副本,某个线程对这个变量的修改不会影响其他线程副本的值,可以说ThreadLocal为我们提供了一个保证线程安全的新思路。需要注意的是一个ThreadLocal变量,其中只能set一个值。ThreadLocal<String> localName = new ThreadLocal();localName.set("name1");String n
2021-08-01 17:40:18 134
原创 线程状态解析
线程的几种状态在Java中,一个线程从创建到消亡会经历新建状态(New)、就绪状态(Runnable)、运行状态(Running)、等待(Waiting)、阻塞状态(Blocked)和死亡状态。在运行过程中,线程会在这几个状态之间流转。下面对这几种状态做下简单解释: 新建状态(New): 新创建了一个线程对象,还未调用线程的start()方法。 就绪状态(Runnable): 线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于可运行线程池中,变得可运行,等
2021-08-01 17:39:20 698
原创 Object的wait、notify和notifyAll方法
方法简介wait方法当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起(进入waiting状态),直到发生下面几件事情之一才能返回:其他线程调用了该共享对象的notify()或者notifyAll()方法; 其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。另外需要注意的是,如果调用wait()方法的线程没有事先获取该对象的监视器锁,则调用wait()方法时调用线程会抛出IllegalMonitorStateEx
2021-08-01 17:38:26 268
原创 Thread类的详细介绍
Thread类简介Thread类是Java中实现多线程编程的基础类。本篇博客就来介绍下Thread类的常用API和常见用法。Thread类常用的方法如下:Thread.activeCount():这个方法用于返回当前线程的线程组中活动线程的数量,返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态更改。)。 Thread.checkAccess(): 检验当前正在执行的线程是否有权限修改thread的属性,这个方法我们一般不自己进行调用,Thread类的set方法在进行属性
2021-08-01 17:36:49 5748 2
原创 实现多线程的几种方式
在Java中有多种方式可以实现多线程编程(记得这是一道常问的面试题,特别是在应届生找工作的时候被问的频率就更高了)。继承Thread类并重写run方法; 实现Runnable接口,并将这个类的实例当做一个target构造Thread类 实现Callable接口;继承Thread类通过继承Thread类来实现多线程编程很容易。下面代码中MyThread类继承了Thread类,并重写了run方法。但是这种方式不是很建议使用,其中最主要的一个原因就是Java是单继承模式,MyThread类继承了
2021-08-01 17:34:28 229
原创 上下文切换的确切含义了解下
上下文切换的含义其实在单个处理器的时期,操作系统就能处理多线程并发任务。处理器给每个线程分配 CPU 时间片(Time Slice),线程在分配获得的时间片内执行任务。CPU 时间片是 CPU 分配给每个线程执行的时间段,一般为几十毫秒。在这么短的时间内线程互相切换,我们根本感觉不到,所以看上去就好像是同时进行的一样。时间片决定了一个线程可以连续占用处理器运行的时长。当一个线程的时间片用完了,或者因自身原因被迫暂停运行了,这个时候,另外一个线程(可以是同一个线程或者其它进程的线程)就会被操作系统
2021-08-01 17:33:38 438 1
原创 并发编程中你需要知道的基础概念
多线程是Java编程中一块非常重要的内容,其中涉及到很多概念。这些概念我们平时经常挂在嘴上,但是真的要让你介绍下这些概念,你可能还真的讲不清楚。这篇博客就总结下多线程编程中经常用到的概念,理解这些概念能帮助我们更好地掌握多线程编程。进程(Process)与线程(Thread)进程和线程是最常提到的概念了。在linux中,线程与进程最大的区别就是是否共享同一块地址空间,而且共享同一块地址空间的那一组线程将显现相同的PID号。下面介绍下两者的概念:进程是操作系统进行资源分配和调度的最小单元,可以简单
2021-08-01 17:32:37 82
原创 Java对并发编程的支持历史
1. JDK1.4及之前在JDK1.4及之前的版本,主要提供的并发技术有:synchronized关键字 volatile关键字 不变模式(不可变类)1.1 volatile关键字#引用百度百科的解释:volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。注:百度百科的解释并不是专门针对jav
2021-08-01 17:31:26 93
原创 摩尔定律失效“带来”并行编程
并发和并行#在真正开始聊本文的主题之前,我们先来回顾下两个老生常谈的概念:并发和并行。并发:是指多个线程任务在同一个CPU上快速地轮换执行,由于切换的速度非常快,给人的感觉就是这些线程任务是在同时进行的,但其实并发只是一种逻辑上的同时进行; 并行:是指多个线程任务在不同CPU上同时进行,是真正意义上的同时执行。下面贴上一张图来解释下这两个概念:上图中的咖啡就可以看成是CPU,上面的只有一个咖啡机,相当于只有一个CPU。想喝咖啡的人只有等前面的人制作完咖啡才能制作自己的开发,也就是同.
2021-08-01 17:28:46 286
转载 Centos7安装Redis6整理
1. 安装准备#安装gccyum -y install gcc tcl# 查看gcc版本是否在5.3以上,centos7.6默认安装4.8.5gcc -v2.gcc版本过低编译redis6.0时会报如下错误# 升级到gcc 9.3:yum -y install centos-release-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutilsscl enable d.
2021-05-20 00:40:04 121
原创 Java NIO通信基础详解
高性能的Java通信,绝对离不开Java NIO技术,现在主流的技术框架或中间件服务器,都使用了Java NIO技术,譬如Tomcat、Jetty、Netty。学习和掌握NIO技术,已经不是一项加分技能,而是一项必备技能。不管是面试,还是实际开发,作为Java的“攻城狮”,都必须掌握NIO的原理和开发实践技能。3.1 Java NIO简介在1.4版本之前,Java IO类库是阻塞IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为JAVA NIO。New IO类库的
2021-03-06 00:32:31 488
转载 netty源码分析之揭开reactor线程的面纱(三)
上两篇博文(netty源码分析之揭开reactor线程的面纱(一),netty源码分析之揭开reactor线程的面纱(二))已经描述了netty的reactor线程前两个步骤所处理的工作,在这里,我们用这张图片来回顾一下:简单总结一下reactor线程三部曲轮询出IO事件 处理IO事件 处理任务队列今天,我们要进行的是三部曲中的最后一曲【处理任务队列】,也就是上面图中的紫色部分。读完本篇文章,你将了解到netty的异步task机制,定时任务的处理逻辑,这些细节可以更好地帮助你写出net
2021-02-26 01:21:26 184 1
转载 netty源码分析之揭开reactor线程的面纱(二)
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下reactor线程我们已经了解到netty reactor线程的第一步是轮询出注册在selector上面的IO事件(select),那么接下来就要处理这些IO事件(process selected keys),本篇文章我们将一起来探讨netty处理IO事件的细节我们进入到reactor线程的 run 方法,找到处理IO事件.
2021-02-26 01:17:08 145
转载 netty源码分析之揭开reactor线程的面纱(一)
netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如何来优雅地fix掉jdk的nio bug?带着这些疑问,本篇文章将庖丁解牛,带你逐步了解netty reactor线程的真相[源码基于4.1.6.Final]。reactor 线程的启动NioEventLoop的run方法是reactor线程的主体,在第一次添加任务的时候被启动NioEventLo
2021-02-26 01:13:18 177
原创 高并发IO的底层原理
高并发IO的底层原理本文的原则是:从基础讲起。IO的原理和模型是隐藏在编程知识底下的,是开发人员必须掌握的基础原理,是基础的基础,更是通关大公司面试的必备知识。本文从操作系统的底层原理入手,通过图文并茂的方式,为大家深入剖析高并发IO的底层原理,并介绍如何通过设置来让操作系统支持高并发。1.1 IO读写的基础原理大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用...
2020-08-14 01:33:40 488
原创 K8s 学习笔记(一)
一、Master Kubernetes里的Master指的是集群控制节点,在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它负责具体的执行过程,我们后面执行的所有命令基本都是在Master上运行的。Master通常会占据一个独立的服务器(高可用部署建议用3台服务器),主要原因是它太重要了,是整个集群的“首脑”,如果它宕机或者不可用,那么对集群内容器应用的管理都将失效。在Master上运行着以下关键进...
2020-08-14 00:59:28 500
原创 数据结构之树
目录一、基本概念:二、二叉树 1、树是n(n≥0)个节点的有限集T,n为0时称为空树,对于非空树有且仅有一个特定被称为根的节点。下图中树的节点有限集T={A,B,C,D,E,F,G,H,I,G,K,L,M,N,O} 2、 对于非空树有且仅有一个节点被称为根节点;(其中A是根节点)3、非根节点的m个互不相交的子集T1,T2….,Tm ,其中每个子集本身又是一棵树。称为子树。T1={B}...
2020-06-29 18:52:34 228
原创 设计模式之观察者模式
观察者模式当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。介绍意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。如何解决:使用面
2020-05-19 02:07:11 216
转载 为什么 Redis 快照使用子进程
为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。虽然我们经常将 Redis 看做一个纯内存的键值存储系统,但是我们也会用到它的持久化功能,RDB 和 AOF 就是 Redis 为我们提供的两种持...
2020-03-22 01:27:55 896
转载 大众点评订单系统分库分表实践
原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护;业务需求层出不穷,原有的订单模型很难满足业务需求,但是基于原订单表的DDL又非常吃力,无法达到业务要求。随着这些问题越来越突出,订单数据库的切分就愈发急迫了。这次切分,我们的目标是未来十年内不需要...
2020-03-21 21:44:00 186
转载 MySQL索引背后的数据结构及算法原理
摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第...
2020-03-21 21:41:09 192 1
原创 MySQL 性能优化神器 Explain 使用分析
简介MySQL 提供了一个 EXPLAIN 命令, 它可以对SELECT语句进行分析, 并输出SELECT执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如:EXPLAIN SELECT * from user_info WHERE id < 300;准备为了接下来方便演示 ...
2020-03-21 16:36:50 141
原创 COUNT(1)和COUNT(*) 的区别
两者本质上没有任何区别。参见MYSQL 参考手册 InnoDBhandlesSELECT COUNT(*)andSELECT COUNT(1)operations in the same way. There is no performance difference.一、count情况1、count(1):可以统计表中所有数据,不统计所有的列,...
2020-03-21 02:56:35 13692
转载 进程与线程的一个简单解释
进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一...
2020-03-21 02:32:14 79
转载 进程和线程的区别
关于进程和线程,大家总是说的一句话是“进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”。这句话理论上没问题,我们来看看什么是所谓的“资源”呢。什么是计算机资源经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种:1. 计算资源2. 存储资源CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对输入的指令和数据进行...
2020-03-21 02:30:46 226
原创 什么是多核,并行和并发的区别
在计算机设计早期,为了响应更多计算性能的需要,单处理器系统发展成为多处理器系统。更现代的、类似的系统设计趋势是将多个计算核放到单个芯片。无论多个计算核是在多个CPU芯片上还是在单个 CPU 芯片上,我们称之为多核或多处理器系统。多线程编程提供机制,以便更有效地使用这些多个计算核和改进的并发性。考虑一个应用,它有 4 个线程。对于单核系统,并发仅仅意味着线程随着时间推移交错执行(图 1),因为处理...
2020-03-21 02:24:57 2167
转载 Java与线程
并发不一定要依赖多线程(如PHP中很常见的多进程并发)。线程的实现 各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。 每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。Thread的所有关键方法都是声明为Native的。在Java API中,一个Native方法往往意味着这个方法没有...
2020-03-21 02:23:49 122
转载 为什么 redis 单线程却能支撑高并发
redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理和特点,就是 redis 实际上是个单线程工作模型,你要是这个都不知道,那后面玩儿 redis 的时候,出了问题岂不是什么都不知道?还有可能面试官会问问你 redis 和 memcache...
2020-03-21 01:21:17 369
原创 Innodb中的事务隔离级别和锁的关系
前言我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。一次封锁or两段锁...
2020-03-20 21:47:05 116
转载 数据库并发控制 - 锁和 MVCC
在学习几年编程之后,你会发现所有的问题都没有简单、快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制。如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程;而并发(Concurrency)使一切事情的发生都有了可能,...
2020-03-20 20:38:14 251
转载 MySQL 索引设计概要
在关系型数据库中设计索引其实并不是复杂的事情,很多开发者都觉得设计索引能够提升数据库的性能,相关的知识一定非常复杂。然而这种想法是不正确的,索引其实并不是一个多么高深莫测的东西,只要我们掌握一定的方法,理解索引的实现就能在不需要 DBA 的情况下设计出高效的索引。本文会介绍数据库索引设计与优化中设计索引的一些方法,让各位读者能够快速的在现有的工程中设计出合适的索引。磁盘 ...
2020-03-20 20:35:29 100
最全ASCII码对照表
2011-07-18
C# asp.ent 存储过程分页
2011-06-07
asp.net 面试指南
2011-06-07
C#设计模式与工程实践
2010-12-01
C#.数据结构(C#语言版)
2010-12-01
.net中js图片切换
2010-09-12
JavaScript实例集合
2010-09-12
asp.net 网页图片切换效果
2010-08-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人