调优实战-内存溢出的定位与分析 首先,对于以下代码如果造成内存溢出该如何进行定位呢?通过jmap与MAT工具进行定位分析 代码如下: publicclassTestJvmOutOfMemory{ publicstaticvoidmain(String[]args){ List<Object>list=newArrayList<>(); for(inti=0;i<10000000;i){ StringBuilderstr=newStringBuilder(); for(intj=0;j<1000;j){ str.append(UUID.randomUUID(...

CMS:低延迟 在JDK1.5时,HotSpot推出了CMS收集器,CMS收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程和用户线程同时工作 CMS收集器关注尽可能地降低用户线程的停顿时间,停顿时间越短,用户的体验越好 CMS收集器采用标记-清除算法和STW机制来回收内存 CMS作为老年代的收集器无法与之前的新生代收集器ParallelScavenge配合工作,所以在JDK1.5时使用CMS收集老年代,新生代只可以选择ParNew或者Serial CMS收集过程 CMS收集过程较为复杂,分为4个阶段: 初始标记:会出现STW,所有工作线程停止,该...

  7FNu6qbbxJCS   2023年12月22日   13   0   0 垃圾收集器CMSG1CMSG1垃圾收集器

JVM相关工具 JDK工具包 jps 查看Java进程 jps:列出Java程序进程ID和Main函数名称 jps-q:只输出进程ID jps-m:输出传递给Java进程(主函数)的参数 jps-l:输出主函数的完整路径 jps-v:显示传递给Java虚拟机的参数 jstat 查看Java程序运行时相关信息,可以查看运行时堆的相关情况 jstat-<options>[-t][-h<lines>]<vmid>[<interval>[<count>]] options:由以下值构成 -class:显示ClassLoader的相...

欢迎关注公众号:【11来了】发送  pdf 可以下载Redis、JVM系列文章PDF版本! 作者为在读研究生,目前研二,计划在公众号记录学习常用中间件笔记,以及明年更新面试经历! 垃圾回收器 有8种垃圾回收器,分别用于不同分代的垃圾回收: 新生代回收器:Serial、ParNew、ParallelScavenge 老年代回收器:SerialOld、ParallelOld、CMS 整堆回收器:G1、ZGC Serial:串行回收 Serial是最基本、最古老的垃圾收集器 Serial收集器采用复制算法、单线程执行和“STW”机制的方式进行内存回收 除了年轻代之外,S...

运行时数据区 JVM由三部分组成:类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类: 线程独享(此区域不需要垃圾回收) 虚拟机栈、本地方法栈、程序计数器 线程共享(数据存储区域,此区域需要垃圾回收) 存储类的静态数据和对象数据 堆和方法区 堆 Java堆在JVM启动时创建内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域 在JDK1.8中,堆由两部分组成:新生代和老年代 而在JDK1.9中,取消了新生代和老年代的物理划分,将堆划分为若干个区域Region,如下图: 可以通过代码查看...

类加载子系统 JVM架构如下图,接下来将从类加载子系统、运行时数据区来逐步讲解JVM虚拟机 类加载的时机 类加载的时机主要有4个: 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果对应的类没有初始化,则要先进行初始化 new关键字创建对象时 读取或设置一个类型的静态字段时(被final修饰、已在编译器将结果放入常量池的静态类型字段除外) 调用一个类型的静态方法的时候 对类进行反射调用时 初始化一个类的时候,如果其父类未初始化,要先初始化其父类 虚拟机启动时,要先加载主类(程序入口) 类加载过程 类的生命周期如下图: 加载 ...

Java并发编程 synchronized如何保证线程安全 JDK1.6之前,synchronized是一个重量级锁相比于JUC的锁显得非常笨重,存在性能问题 JDK1.6及之后,Java对synchronized进行的了一系列优化,性能与JUC的锁不相上下 synchronized可以保证并发程序的原子性、可见性、有序性 synchronized可以修饰方法和代码块 synchronized如何保证可见性? JMM关于synchronized的两条规定: 线程解锁前:必须把自己本地内存中共享变量的最新值刷新到主内存中 线程加锁时:将清空本地内存中共享变量的值,从而使用共享变量时需要从主内存...

  7FNu6qbbxJCS   2023年12月12日   50   0   0 Java可见性Java可见性

深入理解BIO与NIO BIO BIO为Blocked-IO(阻塞IO),在JDK1.4之前建立网络连接时,只能使用BIO 使用BIO时,服务端会对客户端的每个请求都建立一个线程进行处理,客户端向服务端发送请求后,先咨询服务端是否有线程响应,如果没有就会等待或者被拒绝 BIO基本使用代码: 服务端: publicclassTCPServer{ publicstaticvoidmain(String[]args)throwsException{ //1.创建ServerSocket对象 System.out.println("服务端启动...."); System.out.println("初...

Redis的bitmap实现签到系统? 答:主要讲一下Redis原生的bitmap的使用方法,以及如何使用bitmap来实现签到功能 先来看一下如何使用redisbitmap的原生命令实现签到功能: 签到 我们先来设计key:userid:yyyyMM,那么假如usera在2023年10月3日和2023年10月4日签到的话,使用以下命令: setbitkeyoffsetvalue: 在3日签到的话,偏移量应该设置为2,则签到之后为001 在4日签到的话,偏移量应该设置为3,则3日、4日签到后为0011(第3位和第4位都是1,表示这两天签到了) 在31日签到的话,偏移量应该设置为30,表示向...

Redis集群故障探测 在生产环境中,如果Redis集群崩溃了,那么会导致大量的请求打到数据库中,会导致整个系统都崩溃,所以系统需要可以识别缓存故障,限流保护数据库,并且启动接口的降级机制 降级方案设计我们在系统中操作Redis一般都是通过工具类来进行操作的,假设工具类有两个RedisCache和RedisLock,那么通过AOP对这两个工具类的所有方法做一个切面,如果在这两个类中执行Redis操作时,Redis挂掉了,就会抛出异常(Redis连接失败),那么我们在切面的处理方法上捕捉异常,再记录下来,判断是Redis集群挂了还是展示网络波动 判断是集群挂掉还是网络波动的话,我们可以配置规则,...

  7FNu6qbbxJCS   2023年12月09日   11   0   0 redis缓存Redis缓存

由于业务需要,在SpringBoot项目下的resources目录需要放一个docx文件,并进行读取,本来采用的Spring提供的ResourceUtil进行读取,本地测试正常,在服务器打成jar包后,发现文件读取不到,代码如下: FilefileTemplate=org.springframework.util.ResourceUtils.getFile("classpath:AnalyseTemplate.docx"); 查了之后,发现在jar包中需要使用inputStream进行读取,于是修改代码如下即可: ClassPathResourceres=newClassPathReso...

生产环境中热key处理 热key问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的key就是热key,往往这样的key也是存储在了一个redis节点中,对该节点压力很大 那么对于热key的处理就是通过热key探测系统对热key进行计数,一旦发现了热key,就将热key在jvm本地缓存中再存储一份,那么当再有大量请求来读取时,就直接在应用的jvm缓存中读取到直接返回了,不会再将压力给到同一个redis节点中了,如下图: 京东开源了高性能热key探测中间件:JD-hotkey,可以实时探测出系统的热数据,生产环境中可以基于JD-hotkey来解决热key的问题 生产环境中...

  7FNu6qbbxJCS   2023年12月08日   35   0   0 redis缓存数据数据Redis缓存

Redis实现订阅发布 Redis可以通过订阅发布功能来实现动态接收消息的功能 场景:如果服务提供者新提供了一些接口供消费者使用,这两个服务并不在一个模块下,怎么可以让消费者动态的感知到提供者新添加的接口。 为什么要使用Redis订阅发布? Redis的确可以使用订阅发布,但是其实并不是专业的 使用Redis订阅发布的原因无非在于项目中已经引入了Redis,不想再引入更多个组件(MQ),因此才使用Redis实现订阅发布 Redis订阅发布的缺点 Redis订阅发布适用于项目中对于订阅发布的信息的发送接收要求并不严格的情况下才可以使用,因为Redis中的订阅发布并不会对发布信息进行持久化,所以可...

  7FNu6qbbxJCS   2023年12月07日   14   0   0 redisspringspringRedis

基于缓存分片的下单库存扣减方案 将商品进行数据分片,并将分片分散存储在各个Redis节点中,那么如何计算每次操作商品的库存是去操作哪一个Redis节点呢? 我们对商品库存进行了分片存储,那么当扣减库存的时候,操作哪一个Redis节点呢? 通过轮询的方式选择Redis节点,在Redis中通过记录商品的购买次数(每次扣减该商品库存时,都对该商品的购买次数加1),key为product_stock_count:{skuId},通过该商品的购买次数对Redis的节点数取模,拿到需要操作的Redis节点,再进行扣减 如果只对这一个Redis进行操作,可能该Redis节点的库存数量不够,那么就去下一个Re...

  7FNu6qbbxJCS   2023年12月06日   17   0   0 luaredisLuaRedis

分页列表缓存的延迟构建 首先,先来讲一下业务场景,用户会在APP中去分享内容,那么假如用户分享的是美食菜谱内容,在用户分享之后,先将这个美食菜谱的内容作为k-v进行缓存,但是呢,其实对于用户分享的美食菜谱内容其实是会进行分页查询的,比如说别人点击进入你的主页,肯定是分页查询你主页分享的内容,那么我们就要考虑一下什么时候对这个分页查询的缓存列表进行构建呢? 那么这里列表缓存的构建时机有两个: 第一个是真正来查询该用户分享的内容列表时(延迟构建,在真正查询时再进行构建,避免占用Redis内存),此时先在数据库中查询分页数据,再去缓存中构建分页缓存 第二个是用户修改或者新增分享的内容时,此时通过R...

  7FNu6qbbxJCS   2023年12月04日   11   0   0 分页缓存数据数据分页缓存

库存模块缓存架构 我们先来分析一下库存模块的业务场景,分为入库和出库,入库的话,在库存模块中需要添加库存,由于库存也是写多读多的场景,那么也是以Redis作为主存储,MySQL作为辅助存储 出库的话,是在用户下单时,需要去库存中进行减库存的操作,并且用户退款时,需要增加库存 那么库存模块是存在高并发写的情况的,通过对商品库存进行分片存储,存储在多台Redis节点上,就可以将高并发的请求分散在各个Redis节点中,并且提供了单台Redis节点库存不足时的合并库存的功能 先来说一下如何对商品库存进行缓存分片,比如说有100个商品,Redis集群有5个节点,先将100个商品拆分为5个分片,再将5个分...

  7FNu6qbbxJCS   2023年12月04日   11   0   0 luaredisLuaRedis

基于社区电商的Redis缓存架构 首先来讲一下Feed流的含义: Feed流指的是当我们进入APP之后,APP要做一个Feed行为,即主动的在APP内提供各种各样的内容给我们 在电商APP首页,不停在首页向下拉,那么每次拉的时候,APP就会根据你的喜好、算法来不停地展示新的内容给你看,这就是电商APP的Feed流了 那么接下来呢就基于首页Feed流以及社区电商APP中的一些业务场景,来实现一套基于Redis的企业级缓存架构,MySQL为基础,RocketMQ为辅助 那么在缓存中常见的问题有: 热key问题 大key问题 缓存雪崩(穿透) 数据库和缓存数据一致性问题 在Redis生产环境中,...

Redis内核级请求处理流程 RedisServer其实就是Linux服务器中的一个进程 主要还是下图的流程 应用先和server端建立TCP连接 建立连接之后,server端就会有一个与该客户端通信的socket,客户端的读写请求发送到服务端的socket 那么通过IO多路复用,收到读写请求的socket会到队列中排队等待处理 由文件事件分发器将事件分发给对应的命令请求处理器 server端内部也是有一个RedisClient的,由这个Client来处理对数据的操作,这个Client有一个输入缓冲区和输出缓冲区,先将读写命令写入输入缓冲区 再去找到对应的RedisCommand也就是查找到...

  7FNu6qbbxJCS   2023年11月28日   17   0   0 客户端redis数据数据客户端Redis

RedisServer运行原理图 Redis服务器中Socket网络建立以及文件事件模型 一个redis单机,可以抗几百上千的并发,这里的并发指的就是同时可以有几百个client对这个redisserver发起请求,都需要去建立网络连接,同时间可能会有几百个redisclient通过socket和我们的redisserversocket建立网络连接 如果自己使用javasocket编程,无论使用nio、bio,一旦要是说一个server和一个client完成了一个网络连接之后,就会多出来一个socket,socket是抽象出来通信的模型,通过一个socket就可以跟对方的socket形成一个...

  7FNu6qbbxJCS   2023年11月25日   21   0   0 redis串行化串行化Redis

RedisServer运行原理图 Redis服务器中Socket网络建立以及文件事件模型 一个redis单机,可以抗几百上千的并发,这里的并发指的就是同时可以有几百个client对这个redisserver发起请求,都需要去建立网络连接,同时间可能会有几百个redisclient通过socket和我们的redisserversocket建立网络连接 如果自己使用javasocket编程,无论使用nio、bio,一旦要是说一个server和一个client完成了一个网络连接之后,就会多出来一个socket,socket是抽象出来通信的模型,通过一个socket就可以跟对方的socket形成一个...

  7FNu6qbbxJCS   2023年11月24日   16   0   0 redis串行化串行化Redis
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~