自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 问答 (2)
  • 收藏
  • 关注

原创 分布式事务问题

最近在项目中遇到一个分布式事务问题,跟平常的情况不太一样,特此记录一下。正常情况下一个分布式调用过程如下: 这种情况下的回滚:如果方法C执行失败,需要回滚B;如果D执行失败,需要回滚B和C。本地方法的回滚,可以抛异常回滚,也可以手动调spring的方法回滚。远程方法的回滚,可以手动调提供方提供的回滚方法,也可以使用事务消息。事务消息相对复杂一些,这里介绍一下事务消息的执行过程: 事务消息需要提供两个接口:本地事务执行接口:根据事务执行情况返回3种状态:Commit、Rollback、UNKNOW。本地事务

2022-12-03 23:21:45 253 1

原创 Redis集群介绍

能够对外提供相同服务的多台服务器组成的集合。

2022-11-06 23:23:09 508

原创 Java synchronized锁升级过程验证

我们先介绍下锁升级过程。JD6之后分为无锁,偏向锁,轻量级锁,重量级锁。其中偏向锁->轻量级锁->重量级锁的升级过程不可逆。偏向锁:当一个线程第一次获取到锁之后,再次申请就可以直接取到锁核心思想:一开始无锁状态,JVM会默认开启“匿名”偏向的一个状态,就是一开始线程还未持有锁的时候,就预先设置一个匿名偏向锁,等一个线程持有锁之后,就会利用CAS操作将线程ID设置到对象的mark word 的高54位上【64位虚拟机】。......

2022-08-28 12:02:51 187

原创 Java AQS锁实现原理

最后,我想说的是,AQS的实现思想并不仅仅局限于在读写锁中使用,在很多Java中间件、JVM以及操作系统中都有运用,包括其他语言中也有运用。判断队列中有没有其他线程在等待锁,或者当前线程是第一个在等待锁的线程,也就是等待队列中第一个线程,然后CAS尝试修改锁状态,设置当前线程为锁拥有者。从代码实现上看,能看到的变量几乎都是volatile的,能看到的方法几乎都是CAS或者Unsafe类的原子方法。这几个方法是使用AQS类的关键,只有这几个方法是可以定制的,其他方法几乎都是final的,不可修改。......

2022-08-14 14:03:28 481

原创 java序列化导致的问题

最近在做一个需求的迭代过程中,遇到了一个tair(公司的一款缓存中间件,类似Redis)反序列化失败的问题,也就是把tair里缓存的值转换成对象的时候报错了。看了一下代码里tair的使用,put的时候value是对象本身,get的时候是把tair获取到的对象进行类型强制转换,类似这种:Person person = new Person();person.setWorkNo("123");person.setName("张三");tairManager.put

2022-06-20 21:31:00 1147 1

原创 基于docker搭建Redis集群

Redis集群选举算法决定了一个Redis集群至少需要3个master,同时每个master节点至少需要一个slave节点做备份,因此一个Redis集群至少需要6个节点。本文也正是在一台宿主机上使用docker构建一个有6个节点的Redis集群。Redis使用槽(slot)指派的方式来进行数据在节点上的分配。一个Redis集群总共有16384(2^14)个槽,假设有3个master,平均每个master负责16384/3=5461个槽。key分配的算法是:对key进行CRC16算法,然后跟16384取模,得

2022-06-12 18:37:16 1490

原创 jvm参数调优_4_调优方法

调优方法一切都是为了这一步,调优,在调优之前,我们需要记住下面的原则:1.多数的Java应用不需要在服务器上进行GC优化;2.多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;3.在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);4.减少创建对象的数量;5.减少使用全局变量和大对象;6.GC优化是到最后不得已才采用的手段;7.在实际使用中,分析GC情况优化代码比优化GC参数要多得多;GC优化的目的有两个(http://www

2022-05-22 21:31:23 162

原创 jvm参数调优_3_问题排查

相关文章:http://www.importnew.com/21441.html(Java系列笔记(4) - JVM监控与调优 - Daniel·广 - 博客园)https://lanjingling.github.io/2016/05/11/java-args-youhua/http://www.ityouknow.com/jvm/2017/09/19/GC-tuning.html成为Java GC专家系列(3) — 如何优化Java垃圾回收机制(本文参考:Java系列笔记(4)

2022-05-22 21:30:44 98

原创 jvm参数调优_2_监测工具

常用工具介绍:jps jinfo jmap jstack jstatjps:进程状态信息jinfo:参数信息常用命令:jinfo pidjmap:查看内存常用命令:jmap -dump:[live,]format=b,file=<filename>:输出heap信息到文件,live表示只输出活的对象到文件。可以用jhat查看dump出的内存信息。jmap -finalizerinfo:打印正等待回收的对象信息jmap -heap:打印heap配置情

2022-05-22 21:29:20 76

原创 jvm参数调优_1_参数设置

一、堆栈设置(堆栈大小、堆内存比例):jvm内存:物理上:整个堆=新生代+老年代+持久代(方法区);逻辑上:一般将堆和方法区分开;-Xms(memory start):初始堆大小,一般初始值可以和最大值设一样,避免GC后内存重新分配。-Xmx(memory max):最大堆大小。-Xmn(memory new):新生代大小,此处的大小是(Eden+2 survivor space)。增大新生代将会减小老年代,对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。-Xss(sta

2022-05-22 21:25:18 1597

原创 数据库优化总结

数据库相关的接口要尽量减少对数据库的操作:1、减少修改数据库的操作2、优化查询方法(等值在前不等值在后,limit分页优化)3、加索引(少值列在前,多值列在后,降低扫描成本)常用的sql优化方法:(1)尽量不要在循环里面执行sql(包括更新和查询),可以先查询出一个list或分段查list,再遍历这个list进行处理(2)查询接口查不到就返回null,不抛异常,不返...

2017-04-28 10:58:13 221

原创 分页查询优化

1、子查询优化法先找出第一条数据,然后大于等于这条数据的id就是要获取的数据缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性。实验下:代码如下复制代码mysql> set profiling=1;Query OK, 0 rows affected (0.00 sec)my

2017-04-28 10:57:40 336

原创 sql优化

1、对于数据量较大或者字段较多的查询,不要直接select *,可以先select id,再根据id查(in取别名、join法)。此处示例是分页查询,普通查询也一样。优化前:SELECT * FROM ucdb_0.userinfo_27 WHEREsubscribe=1 AND aid=55745644ORDER BY subscribe_time DESCL...

2017-04-28 10:57:05 324

原创 1-2.数据一致性问题

避免并发造成数据不一致的问题,即不希望因为并发操作导致数据不一致或结果不准确。基本思路就是不让线程同时操作,将并发操作顺序化,方法有:1.加锁(分布式锁)当多个线程同时操作时,由于有锁的原因,只有第一个获得锁的线程才能操作,其他线程将按获得锁的顺序进行操作;2.使用缓存或队列(并发请求串行化)将所有的线程请求放到队列中,然后从队列中取线程操作。跟线程

2017-04-28 10:55:38 399

原创 1-1.线程阻塞

在高并发情况下容易出现请求丢失(实际是线程阻塞)的问题,原因就是接口或服务是单线程的,而且没有加其他机制。请求丢失其实就是接口阻塞造成的,而阻塞一般由于单线程造成的。更正:目前主流web服务器(如tomcat)本身就被设计成多线程的,对每一个http请求服务器都会启动一个线程来处理,这就意味着我们的接口天然就是多线程的。服务器自身的配置就已经决定了能同时并发的线程数,所谓的线程

2017-04-28 10:55:15 513

原创 1.并发情况导致的线程阻塞和数据一致性问题

所有的并发场景导致的问题都可以归结为两种,即并发问题有两种 :线程阻塞和数据一致性。前者是由于接口不能及时处理当前线程请求,导致丢失其他线程请求;后者是由于并发修改同一记录,可能导致更新丢失,导致数据一致性问题。

2017-04-28 10:54:42 744

原创 log4j

架构:包括核心对象和支持对象核心对象:    |----Logger:用于获取日志信息    |---- Appender:确定日志存放目的地,比如数据库、文件、控 制台、Unix Syslog 等               • AppenderSkeleton               • AsyncAppender               • ConsoleAp

2017-04-28 10:52:52 243

原创 Callable和Runnable用法和比较

比较:Callable有返回值并且可以抛异常;Runnable无返回值并且不能抛异常。FutureTask和Future:Future:接口,用于获得任务的执行结果。Future的get方法获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 FutureTask:实现类,实现了RunnableFuture接

2017-04-28 10:52:06 607

原创 第13章 线程安全与锁优化

一、线程安全1. 线程安全级别有5种:不可变,绝对线程安全,相对线程安全,线程兼容,线程对立(1)不可变保证对象状态不可变是最简单最纯粹的安全(2)绝对线程安全在线程之间不需要使用任何额外的手段就可以实现线程安全,绝对线程安全很难达到,一般都是相对线程安全(3)相对线程安全在一个线程内部或一个对象内部是线程安全的,但是多线程之

2017-04-28 10:31:22 244

原创 第12章 Java内存模型与线程

Java内存模型与线程模型内存模型:1. 主内存与工作内存2. 内存间的交互3. volatile变量4. 原子性、可见性、顺序性5. 先行发生原则线程模型(三种):1. 内核线程:一对一2. 用户线程:一对多3. 混合模型:多对多一、Java内存模型1. 主内存与工作内存java内存模型主要指跟变量相关的内存部分

2017-04-28 10:29:37 238

原创 第8章 虚拟机字节码执行引擎

一、方法调用方法调用的唯一任务就是确定被调用方法的版本,不涉及内部的运行方法调用分为两种:解析和分派(1)对于单一形式的方法,在编译期就确定,这类方法的调用称为解析(2)对于多态方法(重载和重写),调用时需要分派1. 解析2. 分派分为静态分派和动态分派静态分派的典型应用是重载动态分派的典型应用是重写(覆写)(1) 静态分派(静态

2017-04-28 10:28:42 205

原创 第7章 虚拟机类加载机制

类加载器之间的父子关系一、类加载器的启动过程JVM启动时,首先启动启动类加载器(Bootstrap ClassLoader),然后启动类加载器加载扩展类加载器(ExtClassLoader)和程序类加载器(AppClassLoader);启动类加载器用于加载Java核心API,包括扩展类加载器和程序类加载器;扩展类加载器加载扩展API,即/lib/ext中的类;程序类加

2017-04-28 10:27:42 225

原创 第3章 垃圾收集器与内存分配策略

一、关于对象死亡1. 引用计数算法在对象中添加一个引用计数器,当对象被引用时计数器加1;当引用失效时计数器减1;任何时刻计数器都为0的对象就是不可被使用的但Java语言没有使用引用计数法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题2. 根搜索算法(被Java语言使用)从GC Roots对象开始向下搜索,如果能到达对象,说明该对象时存活的能成为

2017-04-28 10:23:46 217

原创 第2章 Java内存区域与内存溢出异常

运行时数据区域(虚拟机内存模型)线程共享区域:堆和方法区线程私有区域:程序计数器,虚拟机栈,本地方法栈生命周期:线程共享区域生命周期跟虚拟机一样,伴随虚拟机的启动而存在;线程私有区域生命周期跟线程一样,伴随线程的启动和结束而建立和销毁。1. 程序计数器每个线程都有一个程序计数器,用来记录当前线程执行的字节码的行

2017-04-28 10:21:44 233

原创 HTTP方法总结

名词解释:安全性:客户端请求不会改变资源的状态幂等性:客户端每次请求的效果都一样HTTP方法:1.OPTIONS获取资源支持的http方法列表。请求:header响应:默认只有header,但也可以有body安全:是幂等:是2.GET获取资源的表述。请求:header响应:header+body。资源表述,一般带body安全:

2017-04-28 10:16:08 501

原创 同步异步和阻塞非阻塞的区别

同步异步关注的是线程调用时的消息通知机制:同步:线程需要获得调用结果,未获得结果前一直处于等待状态,一旦获得结果立即返回;异步:线程不需要获得调用结果,调用后立即返回,由被调用者通知调用者结果;阻塞非阻塞关注的是线程等待调用结果时的状态:阻塞:当前线程在等待调用结果时被挂起,不再执行其他操作;非阻塞:当前线程在等待调用结果时不被挂起,可以执行其他操作;

2017-04-28 10:13:11 339

原创 spring事务和对象锁

对象锁(Lock/synchronized)的注意点:1.对象锁可能锁住的范围比较大,导致接口性能下降,造成线程阻塞;2.对象锁的唯一性问题,如果不是全局唯一锁(使用spring容器对象或static对象只能保证同一服务器唯一,不能保证全局唯一),将起不到锁的作用,最好使用分布式锁;spring事务:spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以

2017-04-28 10:11:52 2510

原创 docker_practice从入门到实践总结

docker主要用于云计算,目标是实现操作系统虚拟化,直接利用了系统内核,这样可以复用本机操作系统,提高系统资源的利用率;传统虚拟化是硬件虚拟化,一个应用对应一个虚拟机,对系统资源的利用率不高。docker将软件与其“依赖的环境”打包在一起,以镜像的方式交付,让软件运行在“标准的环境”中,这非常符合云计算的要求。我们交付的东西不再只是代码、配置文件、数据库定义等,而是整

2017-04-23 15:54:19 1766

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除