- 博客(25)
- 收藏
- 关注
原创 设计一个支持高并发的分布式锁,商品维度
try { // 获取库存数量 40 Boolean product = redisTemplate.opsForValue().setIfAbsent("product-test001", String.valueOf(40), 11, TimeUnit.SECONDS); if (null == product) { int i = 0; // 自旋...
2020-10-10 10:12:47 346
原创 redis各种集合使用场景
1. 统计文章的统计,统计多少人看了多少这篇文章INCR article:readcount:{文章id} GET article:readcount:{文章id}2. 批量生成系统全局系列号(使用redis批量生成序列号提升性能)分库分表自增方式搞不定的情况下 可以使用:1.redis 2 .雪花算法INCR orderId 1每一张表的并发达到几千 ,就使用主键的生成使用自增表浪费Redis性能 ?优化 可以使用批量获取INCRBY orderId 100...
2020-09-15 21:05:46 730
原创 JVM对象创建与内存分配机制深度剖析
经过前两篇 类加载机制以及JVM内存模型剖析与优化的铺垫这篇主要讲解内存分配机制逐步分析1.类加载检查: 虚拟机遇到一条new指令(new关键字、对象的克隆、对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类,类加载过程详解https://blog.csdn.net/q85647842/article/details/1067511822.分配内存类加载完毕后会给对象分配内存空间。对..
2020-07-07 17:34:13 543
原创 符号引用,动态链接,静态链接,直接引用的区别
在类加载的时候会有5部分:加载,验证,准备,解析,初始化静态链接在解析的时候将符号引用变为直接引用,该阶段会把一些静态方法比如mian方法 替换为指向数据所存内存的指针或者句柄等(直接引用)动态链接在程序运行期间完成的将符号引用替换成直接引用符号引用符号引用以一组符号来描述所引用的目标,在编译的时候一个每个java类都会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,多以就用符号引用来代替,而在这个解析阶段就是为了把这个符号引用转化成为真正的地址的阶段。直
2020-06-22 14:40:17 1216 2
原创 为什么hashMap的比例因子要0.75?
最近在看HashMap源码,对于扩容因子=0.75感到很费解,为什么在用了75%的容量的时候就要进行扩容呢?数组中明明还有25%的空间没有使用。为什么不等到数组几乎满了(扩容因子=0.95)的时候才进行扩容?扩容因子=0.95和扩容因子=0.75有什么区别吗?首先来看一下什么是扩容因子。假设hash函数是理想的,数据会通过hash函数均匀的映射到数组上。一个数据映射到每一个桶(bucket)的概率是相等的。那么在任意的数组容量下,put一个数据发生碰撞的概率=数 组 中 元 素 的 个 数 数 组 容 量
2020-11-29 15:46:15 536
原创 arthas的查询watch方法
先附上官方文档在生产中要通过日志来排查日志,但是忘记打印日志怎么办?在生产上只能重新发版再去寻找日志了watch:(方法执行观察) target 调用方法的对象实例 params 方法参数 returnObj 返回值,如果有的话 returnExp 异常,如果有的话 watch 包名.类名 方法名·········watch com.xxx.workbench.controller.FreeP...
2020-11-11 17:43:55 4286
原创 LockSupport.pack和unpack的用法
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数:public native void unpark(Thread thread);public native void park(boolean isAbsolute, long time);isAbsolute参数是指明时间是绝对的,还是相对的。仅仅两个简单的接口,就为上层提供了强大的同步原语。
2020-10-20 18:00:09 783
原创 sleep和wait的应用
在面试中经常性的遇到wait和sleep的区别?1.sleep不会释放锁 ,而wait会释放锁 private static final String LOCK = "lock"; public static void main(String[] args) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + "====start");.
2020-10-20 14:21:32 482
原创 怎么选择合适的垃圾回收器
目前为止还没有一款垃圾回收器是完美的,只有找到最适合自己的,下面分别介绍垃圾收集器介绍1.Serial(-XX:+UseSerialGC-XX:+UseSerialOldGC)Serial是串行垃圾收集器,最古老的垃圾收集器之一,单线程的执行是指它在垃圾收集的时候会暂停其他所有工作线程,也就是STW(Stop the word)直到收集完毕后,STW才结束新生代使用的是复制算法,老年代使用的整理算法STW的解释:https://blog.csdn.net/q85647842...
2020-07-23 17:45:14 758
原创 org.springframework.transaction.UnexpectedRollbackException原因
https://blog.csdn.net/qq_30336433/article/details/83111675
2020-07-16 14:57:11 1378
原创 GC回收碰到跨代引用的对象怎么办?
现在触发Minor GC 但是这个时候老年代有些引用着年轻代的某些对象 那么这些对象是不能被回收的但是这些对象所在的GC Roots在老年代
2020-07-15 15:39:52 1481 3
原创 垃圾收集器多标和漏标的概念
多标和漏标多标在并发标记的时候标记了GCROOT这个对象为起点向下搜索引用的对象,这个时候栈帧出栈了,那么其引用的对象之前已经标记为非垃圾对象,浮动垃圾 下次再收集。针对并发标记,并发清理开始后产生的心对象,通常做法直接当成黑色,本轮不进行清理。这部分对象也可能会变成垃圾,这也算浮动垃圾的一部分漏标现在有GC Roots对象是A 这个时候开始并发标记,标记到了B ,因为A的d是空所以A 直接变为黑色。B开始标记 ,B标记了C为黑色,这个时候B为灰色,因为还有b.d还没标记,这个时候程序.
2020-07-12 21:35:09 2102
原创 为什么请求一高响应速度就变慢而导致的问题
为什么请求一高响应速度就变慢原因假设本来一个订单所需的时间是一秒,但是因为突然的并发访问增加 从原来的单节点300单/秒 增加到1000单/秒 这个时候因为网络带宽,内存,IO读写都吃紧可能从原来的1秒变为2秒甚至3秒都是很有可能的,设想一下,CPU多核运行,请求剧增那么分到这个线程的时间会更少,可能几秒才能完成。如果订单量持续增加?这个时候可能会导致线程抢占到CPU的资源更少,IO读写甚至访问数据库请求长期没有获取到,直接导致报错。对GC的影响假设之前一个订单的时间是一秒,那么这个时候
2020-07-10 13:12:50 1783
原创 git删除master分支并替换master分支
背景:由于master分支进行回滚后,合特性分支无法将之前回滚的代码再合并进去,所以需要拿本地的分支作为master分支(前提是本地分支和回滚前的master分支保持一致,不然会导致之前在生产的代码被覆盖,为什么不能从master分支拉取一个特性分支呢?拉取后的特性分支合并本地分支回滚的代码还是无法合并进去),完成后再删除原master分支来1.基于master分支拉取一个分支作为备份如:center_dev2.删除master分支git push --delete origin maste发.
2020-07-09 11:55:43 4212
原创 STW,没有Stop the world可以吗
STW:stop the world 在JVM触发 minorgc以及full gc时触发如果没有STW行不行?不行假设没有STW 这个时候GC了 但是线程还在继续执行 执行完毕后 局部变量都变成垃圾了 意味着之前找到的那些不被收集的对象变成垃圾对象了 现在GC还没有结束它就已经变成垃圾对象了 几十万上百万的对象 GC都白费了 JVM收集完堆结果不确定 难道还要再遍历一遍吗?这样太复杂了 在找对象的过程中STW 用户线程你先不要变动 找出来的对象就是非垃圾对象 还有个原因: 根据可达性分析算.
2020-06-22 16:53:20 318
原创 JVM内存模型剖析与优化
JVM内存结构示意图JVM虚拟机的内存结构分布黄色区域:堆,方法区为共有区域 蓝色区域:栈,本地方法栈,程序计数器是每个线程独有的 线程包含三部分:程序计数器、线程栈、本地方法栈。 程序计数器:记录当前线程执行到那一个指令 本地方法栈:与线程栈非常相似线程栈包括:局部变量、操作数栈、动态链接、方法出口局部变量:在一个栈帧(函数)里内部定义的变量,例如方法里new出来的对象操作数栈:理解为java虚拟机栈中的一个用于计算的临时数据存储区动态链接:是在程序运行期间完成的将符号引用
2020-06-22 15:56:01 157
原创 打破双亲委派与自定义类加载器
tomcat 这种类加载机制违背了java 推荐的双亲委派模型了吗?答案是:违背了。 很显然,tomcat 不是这样实现,tomcat 为了实现隔离性,没有遵守这个约定,每个 webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器,打破了双亲委 派机为什么可以实现同一个类路径可以加载不同的类呢?众所周知在自定义加载器中如果已经加载了类(类路径+类名),那么就不会委托上级加载,直接返回。但是如果用的是不同的类加载器呢 ? 在A类在加载器中加载了Process类,.
2020-06-18 14:17:13 300
原创 synchronized重入锁分析
直接上正文加锁方式:同步实例方法:锁的是this 当前调用对象同步代码块:加锁的对象是()里的实例同步类方法:锁的是当前类对象,Class对象底层原理:JVM内置锁通过synchronized使用,通过内部对象Monitor(监视器锁)实现,通过进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层的操作系统Mutex lock(互斥锁)实现,是一个重量锁性能较低Unsafe.getUnsafe().monitorEnter(obj); // 手动加锁Unsaf
2020-06-09 16:28:49 142
原创 分布式与集群的不同
http://www.cnblogs.com/aspirant/p/5697807.html在IDF05(Intel Developer Forum 2005)上,Intel首席执行官Craig Barrett就取消4GHz芯片计划一事,半开玩笑当众单膝下跪致歉,给广大软件开发者一个明显的信号,单纯依靠垂直提升硬件性能来提高系统性能的时代已结束,分布式开发的时代实际上早已悄悄地成为
2017-02-08 11:06:22 202
转载 mysql 查询表死锁 和结束死锁的表步骤
1、查询是否锁表show OPEN TABLES where In_use > 0; 2、查询进程 show processlist 查询到相对应的进程===然后 kill id 补充:查看正在锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 查看等待
2017-01-12 16:17:04 273
原创 事物的隔离级别
如果不考虑事务的隔离型,由于事务的并发,将会出现以下问题:1、脏读 --最严重,杜绝发生2、不可重复读3、幻读(虚读)脏读:指一个事务读取了另外一个事务 未提交的数据。假设A向B转账100元,对应的sql语句如下:开启事务 update account set money=money-100where name='a'
2017-01-12 10:50:36 251
转载 JVM介绍
【转】JVM介绍1. 什么是JVM?JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成
2017-01-11 10:10:55 149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人