何足道哉


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

内存屏障

发表于 2018-08-24 | 分类于 操作系统原理
指令执行顺序顺序执行在早期处理器中,处理器执行指令的顺序就是按照我们编写汇编代码的顺序执行的。按序执行对于早期处理器而言是一种行之有效的方案,但随着对时间的要求,我们希望上述过程能够在最短的时间内执行完成,这就促使人们迫切希望找到一种优化指令执行过程的方案 。 乱序执行随着处理器流水线技术和多核技术的发展,目前的高级处理器通过提高内部逻辑元件的利用率来提高运行速度,通常会采用乱序执行技术。打乱机器指令的顺序,就算指令位于后边,只要可以执行,就先执行,这就是乱序执行。 乱序执行的重要概念是实现了避免计算机在用于运算的对象不可获取时的大量等待。 在现代计算机中,处理器的运算速度大大超越了内存速度, ...
阅读全文 »

集群分区设计

发表于 2018-08-22 | 分类于 分布式
哈希取模分区使用特点的数据,再根据节点数量取模,决定映射到哪个节点上。 缺点 当数据扩容或收缩时,数据节点的映射关系需要重新计算,会导致数据的重新迁移 一致性哈希分区为系统中每个节点分配一个token,范围一般在0~2^32,这些token构成一个哈希环。当要根据某个key查找对应的节点时,先根据key计算哈希值,然后顺时针找到第一个token大于等于该哈希值的节点。 优点 添加或删除节点时,只影响哈希环中相邻节点,对其他节点无影响 哈希槽分区Redis集群采用哈希槽分区实现。在Redis的每个节点上都会存储哈希槽信息。根据这些信息,可以找到每个节点负责的哈希槽,进而找到数据所在的节点。 ...
阅读全文 »

关于分布式缓存的高可用

发表于 2018-08-22 | 分类于 分布式
缓存迁移处理分布式缓存迁移是比较困难的,通常我们将其分为平滑迁移和停机迁移。 平滑迁移步骤 双写 迁移历史数据 切读 下线双写 1、双写按照新规则和旧规则同事往新缓存和旧缓存中写数据。 2、迁移历史数据评估需要迁移的历史数据。在某些场景下,通过数据库回溯数据,不断有新数据写入新的缓存,历史数据会逐渐过时,在一定时间之后,新的集群中自然就有了最新的数据,也就不在需要迁移历史数据了。 3、切读把应用层所有的读操作路由到新的缓存集群上。 4、下线双写关闭双写开关,把写入旧集群的逻辑下线。 停机迁移步骤 停应用 迁移历史数据 更改数据源配置 重启应用 这种方式的好处是实现简单、高效,能够有效 ...
阅读全文 »

分库分表

发表于 2018-08-21 | 分类于 数据库
切分方式垂直切分把单一的表拆分成多个表,并分散到不同的数据库(主机)上。一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。 水平切分相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。 分库分表的核心思路就是将原本保存在单表中太大的数据进行拆分,将这些数据分散保存到多个数据库的多个表中,避免因为单 ...
阅读全文 »

读写分离

发表于 2018-08-21 | 分类于 数据库
所有写操作必须对应到主库,读操作可以在主库和从库机器上进行。主库与从库的结构完全一样,一个主库可以有多个从库。读写分离的方式可以有效的提高数据库集群的吞吐量。 常见的主从模型: 主-主-从 主-从-从 问题 主从不同步。所有的写操作在主库中执行,然后异步的更新到从库上。所以从主库同步到从库,有一定的延迟。当系统繁忙时,延迟问题会更加严重。从库机器数量的增加也会使这个问题更严重。 主库是集群的瓶颈,当写操作过多时会严重影响主库的稳定性,如果主库挂掉,则整个集群都将不能正常工作。 最佳实践 当读操作压力大时,可以考虑添加从库来分解大量读操作带来的压力,但当从库达到一定的数量时,就需要考虑分库来 ...
阅读全文 »

引用

发表于 2018-08-21 | 分类于 JDK
强引用强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。 1Object o=new Object(); // 强引用 软引用软引用是用来描述一些有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。 12String str=new String("abc"); // 强引用 SoftReference<String> softRef=new SoftRe ...
阅读全文 »

GC优化

发表于 2018-08-21 | 分类于 JVM
通过收集GC信息,结合系统需求,明确性能目标(例如:停顿时间、GC时间在整个时间所占用的百分比),确定优化方案。例如选用合适的GC回收器、重新设置内存比例、调整JVM参数等。 调整堆的大小选择堆的大小其实是一种平衡。如果分配的堆过小,则程序的大部分时间可能都消耗在GC上,没有足够的时间去运行应用程序的逻辑。如果分配的堆过大,GC停顿消耗的时间取决于堆的大小,堆越大,停顿时间可能越长。设置堆内存的大小,不能超过系统内存的容量。否则操作系统会使用磁盘来充当不足的那部分内存,会导致性能的严重下降。 命令 说明 -Xms 设置老年代初始值 -Xmx 设置老年代最大值 -Xmn ...
阅读全文 »

类加载机制

发表于 2018-08-20 | 分类于 JVM
虚拟机把Class文件加载到内存,并对其进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类的加载机制。 类的生命周期 加载1、通过一个类的全限定名来获取定义此类的二进制字节流。 2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 对于数组类而言,数组类本身不通过类加载器创建,它是由Java虚拟机直接创建的。 验证为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 准备准备阶段是正式为类变量分配内存并 ...
阅读全文 »

ByteBuf缓冲区

发表于 2018-08-20 | 分类于 netty
ByteBuf是Netty中实现的字节缓冲区。 工作原理ByteBuf与Java NIO中ByteBuffer最大的不同点点在于,ByteBuffer中只维护了一个索引,因此需要调用flip()方法切换读写模式。而ByteBuf中,维护了两套索引,一个读索引,记录了已读取的位置;另一个写索引,记录了可写的位置。ByteBuf中名称以read或write开头的方法会推进相应的索引,而以set或get开头的不会。可以指定ByteBuf最大的容量,默认是Integer.MAX_VALUE。 上图展示了一个刚初始化的ByteBuf,读索引和写索引的初始值为0。 随着读、写指针的偏移,ByteBuf ...
阅读全文 »

MappedByteBuffer

发表于 2018-08-20 | 分类于 IO
内存管理 MMC:CPU的内存管理单元 物理内存:内存条的内存空间 虚拟内存:计算机系统内存管理的一种技术,它使得应用程序认为它拥有连续的可用内存(一个连续完整的地址空间);而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换 页面文件:操作系统反映构建并使用虚拟内存的硬盘空间大小而创建的文件 缺页中断:当程序试图访问已映射在虚拟空间中但未被加载到物理内存的一个分页时,由MMC发出中断;如果操作系统判断此次访问是有效的,则尝试将相关的页从虚拟内存文件中载入物理内存 MappedByteBufferMappedByteBuffer继承自ByteB ...
阅读全文 »
1234

傅鹏

34 日志
16 分类
60 标签
© 2019 傅鹏
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4