- 博客(75)
- 收藏
- 关注
原创 K8S 基本概念
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务(当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务。在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度。可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退。可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
2023-06-14 21:20:51
1591
原创 设计模式 - 观察者模式
在WeatherData中,当增加一个第三方,都需要创建一个对应的第三方的公告板 对象,并加入到dataChange, 不利于维护,也不是动态加入。
2023-05-26 14:04:49
238
原创 设计模式 - 建筑者模式
设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好. 也就 是说,这种设计方案,把产品(即:房子) 和 创建产品的过程(即:建房子流程) 封 装在一起,耦合性增强了。是比较好理解,简单易操作。
2023-05-25 16:54:55
214
原创 设计模式 - 单例设计模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类,并且该类只提供一个取得其对象实例的方法(静态方法)。
2023-05-23 17:42:05
405
原创 JVM 垃圾回收器
串行回收器: Serial、Serrial Old并行回收器: ParNew、Parallel Scavenge、Parallel Old并发回收器: CMS、G1新生代收集器: Serial、ParNew、Parallel Scavenge老年代收集器: Serial Old、Parallel Old、CMS整堆收集器: G1没有一种放之四海皆准、任何场景下都适合的完美收集器存在,更加没有万能的收集器,我们选择只是对具体应用最合适的收集器。
2023-05-18 13:37:13
893
原创 JVM 垃圾回收相关概念
在操作系统中,是指一个时间段有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行,并发并不是真正意义的 "同时处理",只是CPU 把一个时间段分成几个时间片段,在这几个时间段来回切换。当系统中有一个以上的 CPU时,当一个 CPU 执行一个进程时,另一个 CPU 可以执行另一个进程,两个进程互不抢占 CPU 资源,可以同时进行。设置一个中断标志,各个线程运行到 Safe Point 的时候主动轮询这个标志,如果中断标志为真,则将自己运行中断挂起。回收完,再启动程序的线程。
2023-05-17 13:00:22
363
原创 JVM 垃圾回收相关算法
上述现有的算法,在垃圾回收过程中,应用软件将处于一种Stop the World 的状态。在 Stop the World 状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中存活对象赋值到未被使用的内存块中,之后清除正在使用的内存块的所有对象,交换两个内存角色,最后完成垃圾回收。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,依次反复,直到垃圾收集完成。实现简单,垃圾对象便于辨别;
2023-05-16 22:05:00
407
原创 JVM StringTable
2. 如果不是使用双引号声明的 String 对象,可以使用 String 提供的 Intern() 方法。1. 直接使用双引号声明出来的 String 对象会直接存储在常量池种。
2023-05-15 16:46:21
533
原创 JVM 执行引擎
是Java 虚拟机核心的组成部分之一物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行哪些不被硬件直接支持的指令集格式JVM 主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。
2023-05-15 13:23:07
735
原创 JVM 对象的实例化内存布局和访问定位
初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量, new 指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。如果不规整需要维护一个列表,记录哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。将对象的所属类(即类的元数据信息)、对象的 HashCode 和 对象的GC信息、锁信息等数据存储在对象的对象头中,这个过程的具体设置方式取决于 JVM 实现。3. 处理并发安全问题。
2023-05-13 11:17:14
432
原创 JVM 方法区
因为永久代垃圾回收效率很低,在 Full GC 的时候才会触发,而 Full GC 是老年代的空间不足,永久代不足时才会触发。而 Java 中的字节码需要数据支持,通常这种数量会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table), 包括各种字面量和对类型、域和方法的符号引用。
2023-05-12 15:58:07
1071
原创 JVM 堆
一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但是在逻辑上它应该被视为连续的所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer, TLAB)所有的对象实例以及数组都应该在运行时分配在堆上。
2023-05-11 15:07:31
846
原创 JVM 虚拟机栈
由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的优点是跨平台, 指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令栈是运行时的单位,即程序如何执行,而堆是存储的单位,数据怎么放,放在哪儿。Java 虚拟机栈(Java Virtual Machine Stack), 早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧(Stack Frame),对应着一次次的 Java 方法调用。
2023-05-09 22:55:30
1005
原创 JVM 程序计数器(PC 寄存器)
JVM中的程序计数寄存器( Program Counter Register) 中,Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令它是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。
2023-05-08 22:58:19
458
原创 JVM 类加载子系统
粗略图:详细图:类加载器 ClassLoader 角色:类的加载过程:加载:加载 .class 文件的方式:验证(Verify):准备(Prepare):解析(Resolve):初始化:启动类加载器(引导类加载器,Bootstrap ClassLoader):扩展类加载器( Extension ClassLoader):应用程序类加载器(系统类加载器, AppClassLoader):类加载器实例代码:ClassLoader 的使用说明 为什么要自定义类的加载器:用户自定义类加载器实现步骤:
2023-05-08 21:53:05
414
原创 JVM 体系结构
Java 虚拟机的启动是通过引导类加载器(bootstrap class loader) 创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义。需要不同语言由自己编译器,生成符合 JSR-292 JVM规范的字节码文件,即可在 Java 虚拟机中运行。性能优秀和执行更高效。
2023-05-07 10:36:29
507
原创 JUC多并发编程 读写锁
一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。读写互斥,读读共享。将写入锁降级为读锁,重入锁允许再获取写锁之后,可再获取读锁。
2023-05-06 12:35:40
96
原创 JUC多并发编程 AQS
基础解释:锁和同步器的关系:同步器的作用:AQS类图:AQS 自身:Node 内部类:ReentrantLock:acquire: addWaiter 入队: acquireQueued: cancelAcquire:unlock: unparkSuccessor:总结
2023-05-06 10:16:00
725
原创 JUC多并发编程 Synchronized与锁升级
在无锁状态下,Mark Word 中可以存储对象的 identity hash code 值。当对象的 hashCode() 方法第一次被调用时,JVM 会生成对应的 identity hash code 值并将该值存储在 Mark Word中对于偏向锁,在线程获取偏向锁时,会用 Thread ID 和 epoch 值覆盖 identity hash code 所在的位置。如果一个对象的 hashCode() 方法已经被调用过一次之后,这个对象不能设置偏向锁,升级为轻量级锁。
2023-05-04 17:52:37
538
原创 JUC多并发编程 对象内存布局
在 Hotspot 虚拟机里,对象在堆内存中存在布局可划分为三个部分: 对象头(Header), 实例数据(Instance Data) 和对齐填充(Padding 保证8字节位数)对象头对象标记 MarkWord, 在64位操作系统中, Mark Word 占8个字节, 类型占 8个字节,一共 16个字节GC 年龄采用 4 位 bit 存储, 最大为 15, MaxTenuringThreshold = 15存储内容标志位状态对象哈希码、对象分代年龄01未锁定指向锁记录的指针00。
2023-05-04 10:55:15
491
原创 JUC多并发编程 ThreadLocal
ThreadLocal 并不解决线程间共享数据的我呢提ThreadLocal 适用于变量在线程间隔且方法间共享的场景ThreadLocal 通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题每个线程有一个只属于自己的专属 Map 并维护了 ThreadLocal 对象与具体实例的映射,该Map 由于只被持有它的线程访问, 故不存在线程安全以及锁的问题。
2023-04-27 22:37:20
456
原创 JUC多并发编程 原子类
LongAdder 在无竞争的情况,跟 AtomicLong 一样,对同一个 Base 进行操作,当出现竞争关系时是采用化整为零分散热点的做法,用空间换时间, 用一个数组 cells, 将一个 value 拆分进这个数组 cells。多个线程需要同时对 value 进行操作时候,可以对线程 ID 进行 hash 得到 hash 值,再根据 hash 值映射到这个数组 cells 的某个下标,再对该下标所对应的值进行自增操作。
2023-04-27 14:53:50
391
原创 JUC多并发编程 CAS
CAS 是实现自旋锁的基础,CAS 利用 CPU 指令保证了操作的原子性,以达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方法去尝试获取锁,当线程发现锁呗占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗, 缺点是循环会消耗 CPU。compare and swap 的缩写,比较并转换,实现并发算法时常用到的一种技术。它包含三个操作数-内存位置、预期原值级更新值。不代表过程没有问题,可引入版本号,戳记流水。
2023-04-24 17:31:51
452
原创 JUC多并发编程 内存模型
JMM 本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程) 各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变化成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。
2023-04-23 13:55:38
376
原创 JUC多并发编程 LockSupport和线程中断
interrupt() 仅仅是设置线程的中断状态为true, 发起一个协商而不会立刻停止线程。将当前线程的中断状态清零并重新设为 false,清除线程的中断状态。返回当前线程的中断状态,测试当前线程是否已被中断。
2023-04-20 22:30:12
337
原创 JUC多并发编程 锁
一个对象里面如果有多个 synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个 synchronized 方法了,其他的线程都只能等待,换句话说,某一个时刻,只能有唯一的一个线程去访问这些synchronized 方法,锁的是当前对象 this, 被锁定后,其它的线程都不能进入到当前目前对象的其他的 synchronized 方法。
2023-04-19 17:13:14
381
原创 JUC多并发编程 CompletableFuture
定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等Future + 线程池异步多线程任务配合,能显著提高程序的执行效率。
2023-04-18 17:22:50
398
原创 JUC多并发编程 初探
java 线程是通过 start 的方法启动执行的,主要内容在 native 方法 start0中, openjdk的写 JNI 一般是一一对应的, Thread.java 对应的就是 Thread.c, start0 起始就是 JVM_StartThread。此时查看源代码可以看到在 jvm.h 中找到了声明,jvm.cpp 中有实现。
2023-04-17 21:44:28
405
原创 MySQL 开发
使用 utf8mb4, MySQL 在 5.5.3 之后增加了这个 utf8mb4的编码, mb4 就是 most bytes 4的意思,专门用来兼容四字节的 unicode。好在 utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4 外不需要做其他转换。在使用的时候并不是跳过 offset 行,而是取 offset + N 行,然后返回放弃前 offset行,返回 N 行。6.多表关联查询是否可以设置冗余字段,是否可以简化多表查询或分批查询。7.分而治之:把服务拆分更小力度的微服务。
2023-04-16 18:51:42
165
原创 MySQL 日志
error log 主要记录 MySQL 在启动、关闭或者运行过程中的错误i西南西,在MySQL 的配置文件 my.cnf 中,可以通过 log-error=/var/log/mysqld.log 执行 mysql 错误日志的位置。
2023-04-13 23:05:10
555
原创 MySQL 事务
是一个事务在处理过程中读取了另一个事务未提交的数据,当一个事务正在访问数据并且进行了修改,但是还没提交事务,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据的修改还没提交到数据库,所以另外一个事务读取的数据就是"脏数据"TM(Transaction Manger) 事务管理器: TM 是分布式事务的协调者,TM与每个RM进行通信,负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。当前读:在锁定读(使用锁隔离事务) 的时候读到的最新版本的数据。
2023-04-13 22:35:36
383
原创 MySQL 内部技术架构
当 MySQL 接收到客户端的查询 SQL 之后,仅仅只需要对其进行相应的权限验证之后,就会通过 Query Cache 来查找结果,甚至都不需要经过 Optimizer 模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互。查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直 接去查询缓存中取数据。比如表缓存,记录缓存,key 缓存, 权限缓存等。由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连 接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。方法1: 设置默认存储引擎。
2023-04-12 22:02:08
193
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人