![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 86
现实、太残忍
这个作者很懒,什么都没留下…
展开
-
webFlux框架webClient请求数据报错:Exceeded limit on max bytes to buffer : 262144
WebClient并没有使用项目启动时基于配置创建的类,而是在WebClient.create的时候重新创建类,所以基于配置的方法没用。因为接收响应数据的缓冲区不够大,限制为256k。(AbstractDataBufferDecoder类写死了限制)研究源码,最终发现可以通过WebClient.build时可以修改maxInMemorySize值。我总感觉以上方法不够优雅。决定自己研究解决方案。利用类的加载机制,优先加载项目中的类。利用codecs方法。原创 2022-10-15 11:00:36 · 4022 阅读 · 3 评论 -
java中Runnable、Callable、Future、RunnableFuture、CompletionStage接口区别
它只有一个run()函数,该函数没有返回值。二、Callable接口Callable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值Executor(线程池)就是Runnable和Callable的调度容器。Future接口就是对具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果、设置结果等操作。get方法会阻塞,直到任务返回结果是对Runnable和Future继承的一个接口,具有了他们原创 2022-06-24 11:33:04 · 1029 阅读 · 0 评论 -
分布式事务解决方案
分布式理论参考:分布式理论_现实、太残忍的博客-CSDN博客 缺点:一旦事务协调者宕机或者发生网络抖动,会让参与者一直处于锁定资源的状态或者只有一部分参与者提交成功,导致数据的不一致。因此,在⾼并发性能⾄上的场景中,基于 XA 协议的分布式事务并不是最佳选择。所以它比较适⽤于执⾏时间确定的短事务,整体性能比较差。目前主流的数据库基本都支持XA事务,包括MySQL、Oracle、SQL Server、PostgreSQL。 三阶段提交()是二阶段提交()的一种改进版本 ,为解决两阶段提交协议的阻塞问题。 中原创 2022-06-24 07:42:46 · 318 阅读 · 0 评论 -
分布式理论
基于集群角度来考虑,如果集群中同步慢,会有多种情况例如:从A节点新增一条数据后,我从B节点必须能够读到此数据,才算满足强一致性。通常使用分布式锁达到强一致性。相当于不需要一致性。通常遇到的都是最终一致性。例如:从A节点新增一条数据后,我从B节点暂时没有读取到,稍后我读取到了,这就算满足了最终一致性。包括mysql中的主从同步。在设计和部署分布式系统时,存在三个明显的需求:CAP理论认为在一个系统中对某个数据不存在一个算法同时满足一致性,可用性,分区容错性。往往需要牺牲某一项来满足其他两项。由于CAP定理限制原创 2022-06-23 19:58:54 · 236 阅读 · 0 评论 -
【java网络编程】零拷贝
零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。应用程序和磁盘之间想要传输数据,是没有办法直接进行传输的。整个过程为:应用程序向操作系统发起一个读请求,那么首先磁盘中的数据会被读取到内核地址空间中,然后会把内核地址空间中的数据拷贝到用户地址空间中原创 2022-06-02 13:16:13 · 289 阅读 · 0 评论 -
【java网络编程】netty框架
netty是一个高性能、异步事件驱动的NIO框架,它基于Java Nio提供的API实现,提供了对TCP、UDP和文件传输的支持。Reactor是一种并发处理客户端请求响应的事件驱动模型。服务端在接收到客户端请求后采用多路复用策略,通过一个非阻塞的线程来异步接收所有的客户端请求。一个线程负责建立连接、读、写等操作。如果在业务中处理中出现了耗时操作,就会导致所有请求全部处理延时。只是在单线程的模型情况下,使用线程池管理多个线程,用多线程进行处理业务。该模型采用一个主Reactor仅处理连接,而多个子React原创 2022-06-01 20:33:11 · 5121 阅读 · 1 评论 -
【java网络编程】io模型
BIO全称(blocking I/O):同步阻塞。当客户端有连接请求时,服务端就会需要启动一个线程对客户端的连接进行数据读写,如果客户端不进行读写了,那么这个线程也会等着,这样就会造成阻塞。服务端:客户端服务端客户端缺点:当用户进程发出read操作时,如果kernel中的数据还没有准备好,,那么他并不会block用户进程,而是立马返回一个 error,从用户角度来讲,他发起一个read操作后,并不需要等待,而是马上等到一个结果,用户进程判断是一个error时,他就知道数据换没有准备原创 2022-06-01 13:34:17 · 183 阅读 · 0 评论 -
java对象头详解
对齐:要求能被8字节整除,如果不能,则需要对齐填充(寻址最优,64位机器正好8个字节)ClassLayout类打印对象头看一看对象布局HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头:比如 hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象)等。Java对象头一般占有2个机器码(在32位虚拟机中,1个机器..原创 2022-05-31 20:39:31 · 18186 阅读 · 8 评论 -
java保证线程安全的5种方式
一、互斥同步锁1、synchronized关键字参考:【java并发编程】synchronized关键字原理_现实、太残忍的博客-CSDN博客2、lock接口参考:【java并发编程】lock接口_现实、太残忍的博客-CSDN博客3、分布式锁参考:java分布式锁的三种实现方式_现实、太残忍的博客-CSDN博客二、非阻塞同步1、cas乐观锁(共享线程安全变量)cas+volatile保证线程安全参考:【java并发编程】cas乐原创 2022-05-31 19:02:00 · 3118 阅读 · 0 评论 -
【java并发编程】ThreadLocal线程本地类
一、简介ThreadLocal类是作为线程内部的局部变量而提供的。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。通过ThreadLocal创建的变量只能被当前线程访问,对其他线程不可见,故别的线程无法访问和修改,也就是说:对线程公有化变成对线程私有化。事实上每个线程中都有一个ThreadLocal变量副本。相比于锁的性能:java在使用锁的使用中会导致运行效率降低,ThreadLocal的使用彻底避免对共享资源的竞争,同时又可以不影响效率.原创 2022-05-31 18:07:57 · 919 阅读 · 0 评论 -
【java并发编程】volatile关键字
一、简介保证线程可见性,有序性,但不保证原子性(voilatile是cpu级别的缓存锁,java层面可以不需要关心它,因此需要加上cas才能保证线程安全性)。所以voilatile不能保证线程安全,但是适用于一个线程写,多个线程读的情况。确保线程每次读取,都是读的内存中的实时值,而不是寄存器的旧值。二、JMM内存模型全称java memory model中文名为java内存模型。如图:每个java线程都有自己的工作内存,线程需要操作哪个变量,需要从主内存中load到自己的工作..原创 2022-05-31 14:38:02 · 206 阅读 · 0 评论 -
【java并发编程】AQS框架
简介aqs全称抽象队列同步器是AbstractQueuedSynchronize抽象类。它是一个用来构建锁和同步器的框架,它底层用了CAS技术来保证操作的原子性,同时利用FIFO队列实现线程间的锁竞争,将基础的同步相关抽象细节放在AQS,它能够成为实现大部分同步需求的基础,也是JUC并发包同步的核心基础组件。Lock、ReadWriteLock、CountDowndLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等都是在AQS的基础上实现的。A.原创 2022-05-31 09:50:50 · 1059 阅读 · 0 评论 -
【java并发编程】cas乐观锁
一、cas是什么?cas全程Compare and swap,比较并交换。一种无锁原子算法,是一种乐观锁,用于原子性的更新变量。二、cas实现原理CAS靠硬件实现,是一条CPU的原子指令,基于汇编指令cmpxchg(Intel x86)实现,其作用是让CPU先比较两个值是否相等,然后原子性地更新某个内存地址的值。三、cas操作在java使用unsafe类中的compareAndSwapInt方法是经典实现进入native方法,在c++源码unsafe.cpp文件中原创 2022-05-30 21:49:12 · 807 阅读 · 0 评论 -
java unsafe魔法类
一、简介Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的。二、unsafe类各方法介绍unsafe类大部分是native方法,内容对应jdk源码中的unsafe.cpp文件,主要包含:1、系统相关。主要返回某些低级别的内存信息。如:addressSize()返回系统指针大小 pageSize()返回内存页大小2、对象操作主要提供Object和它的域.原创 2022-05-30 19:55:03 · 311 阅读 · 0 评论 -
【java并发编程】lock接口
一、简介java中的lock接口,功能与synchronizied关键字类似。用来处理同步操作。jdk1.5之前使用synchronizied关键字完成同步作用。jdk1.5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,只需在使用时显式地获取和释放锁。虽然它缺少了synchronized隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。相比synchronized关键字lock好原创 2022-05-30 17:18:16 · 954 阅读 · 0 评论 -
java队列有哪些
java中队列接口是Queue。它的子接口中包含两大类BlockingQueue阻塞队列和Deque双端队列,主要的继承结构如下:一、一般队列1、PriorityQueue优先级队列属于线程不安全队列,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于java多线程环境2、ConcurrentLinkedQueue并发链表队列无锁结构二、Deques双端队列接口1、ArrayDeque2、LinkedList原创 2022-05-30 14:07:58 · 1696 阅读 · 0 评论 -
【java并发编程】无锁并发框架disruptor
一、简介Disruptor是一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列。基于Disruptor开发的系统单线程能支撑每秒600万订单。使用场景:对延时要求很高的场景二、高性能原理1、无锁内部实现都是cas+voilatile实现的,无锁性能比加锁更高2、环形数组(关键)好处:数组比链表性能好,索引快 环形数组中的元素采用覆盖方式,避免了jvm频繁的GC。 数组的大小必须为2的n次方,元素定位可以通过位运算效率会更高3、生产和消费模原创 2022-05-30 12:32:00 · 1523 阅读 · 0 评论 -
【java并发编程】synchronized关键字原理
所有的Java 对象都有自己唯一的隐式同步锁。该锁只能同时被一个线程获得,其他试图获得该锁的线程都会被阻塞在对象的等待队列中直到获得该锁的线程释放锁才能继续工作。synchronized锁的几种状态jdk1.6及以前,synchronized是重量级锁(需要靠操作系统阻塞和唤醒,因此效率不高)jdk1.6之后,synchronized锁分为4种状态(锁升级过程)原本是“无锁”状态 一个线程加锁,将线程id写入对象头markwork,升级为“偏向锁” 多个线程cas加锁,轻量竞争,升级原创 2022-05-29 21:56:08 · 753 阅读 · 0 评论 -
java分布式锁的三种实现方式
分布式锁的核心思想,就是使用外部的一块共享的区域,来完成锁的实现。一、使用mysql数据库实现(基本不用)1、使用数据库悲观锁可以使用select ... for update来实现分布式锁。例如:建一个lock表,获取锁就是插入一条数据,移除锁就是删除掉这条数据,使用mysql的for update来保证原子性。2、使用数据库乐观锁增加一个version字段,每次更新修改,都会自增加一。例如:为id是1的用户余额加10select version,balance f.原创 2022-05-29 19:09:05 · 7203 阅读 · 0 评论 -
手动编译openjdk8 c++源码
一、准备资源openjdk源码下载地址:https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-src-b04-14_jan_2020.zip操作环境:使用ubuntu14.04.6,下载地址:https://releases.ubuntu.com/14.04/ubuntu-14.04.6-server-amd64.iso二、开始编译1、必装依赖:apt install make zip gcc g++ libX11-dev l原创 2021-10-26 17:39:23 · 788 阅读 · 0 评论 -
线上java服务自动停止
1、检查磁盘是否满了清理磁盘即可。2、查看服务器系统日志cd /var/logcat messages* |grep java如果存在out of memory 等提示,说明是由于内存不足,linux操作系统把java服务给kill掉了。解决办法:可以调低java服务的内存,或是增加物理内存或swap空间...原创 2021-02-02 22:19:55 · 1558 阅读 · 0 评论 -
springboot读取nacos配置中心配置
官方地址:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html示例:项目内容如下:一、nacos编辑配置文件dataId:cloud.service-platform.media Group:service-platform 配置格式没用,只是增加一点颜色,方便编辑 配置了一个port8081和urlhead=testnamespace(tenat):命名空间默认是 public 可以添加 dev prod te原创 2021-01-27 15:22:45 · 25394 阅读 · 2 评论 -
java spi机制
什么是SPI?SPI(service provider interface)表示服务提供接口。主要用于被第三方实现或扩展的接口。SPI的作用就是为这些被扩展的接口寻找实现类。API和SPI的区别?api是提供方制定接口,并对接口进行实现。调用方只能调用,不能选择实现类。spi是提供方制定接口。调用方选择自己的实现类调用。spi优点:解耦。不需要改动源码就可实现扩展。 没有侵入性。扩展也不需要改动原来代码 只需要添加配置就可实现扩展,符合开闭原则(对扩展开放,对修改关闭)一、原创 2021-01-27 13:10:42 · 352 阅读 · 2 评论 -
java json库之JsonLib、Gson、Jackson、FastJson
之前被Json-lib库坑过,解析的太tm慢了。切换成FastJson库后性能有了质的飞跃。借此整理一下各json库一、Json-lib库最古老、使用范围最广,但是性能最差的一款json库。不推荐!添加依赖:<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4&原创 2021-01-19 21:19:29 · 352 阅读 · 0 评论 -
mysql事务隔离级别和spring Transaction事务传播
事务的ACID原则是什么?原子性(atomicity):最小且不可分割的。要么都执行,要么都不执行。 一致性(consistency):事务的执行使得数据库从一种正确状态转换成另一种正确状态 隔离型(isolation):各事务同步执行时,所获取的数据,不受其他事务的影响。 持久性(durability):事务提交之后,结果永远保存在数据库中。并发下事务会产生什么问题?脏读:事务A读取了事务B未提交的数据。 不可重复读:在同一个事务里面读取了两次某个数据,但是读出来的数据不一致。 幻读:原创 2021-01-14 21:26:51 · 157 阅读 · 0 评论 -
arthas使用ognl修改线上动态对象(实例)的属性值
线上我们某个业务功能有个开关没有打开。需要在不重启服务的情况下把isOpen这个值变成truearthas是一个很好的工具。用它修改静态的变量非常方便,但是动态的就有点麻烦了。不过也是可以实现的。原理:1、首先从spring容器中拿到LedgerTimer类的实例2、使用反射找到LedgerTimer类的isOpen字段3、通过反射修改isOpen字段的值具体做法:1、首先启动arthas连接上我们的服务,这里不再赘述。https://blog.csdn.net/u013原创 2020-11-25 13:23:05 · 7987 阅读 · 1 评论 -
java.net.SocketException: Connection reset
出现错误的现象:刚搭建好的服务调用另一台服务的接口时:报错java.net.SocketException: Connection reset,如图对应的源代码如下,是很正常的调用另一个服务请求 // 创建连接 URL url = new URL("https://baidu.org.cn"+CREATE_API); HttpURLConnection connection = (HttpURLConnection) u原创 2020-12-31 22:54:20 · 8454 阅读 · 0 评论 -
java json返回数据不全
起因线上经过一次更新部署后莫名出现json返回数据不全,导致前端页面显示不出来数据,如图:注:更新内容有一项是把实体的属性改成懒加载。起初1、以为是nginx,设置了响应数据的长度。绕过了nginx直接访问了tomcat,发现还是有问题。排除了nginx。2、以为是懒加载的问题,因为项目更新中含有这些内容。在配置文件中增加了#配置就是在controller层就打开EntityManager,由controller层控制session的开启和关闭,这样controller层就可.原创 2020-12-17 21:31:56 · 4262 阅读 · 0 评论 -
java web接口返回json数据时总是少一个属性
接口返回代码如下:接口返回的result对象如下:/** * @Description 返回结果实体对象 * @Author sunchao * @Date: 2017-11-29 14:43 * @Mender: libing */public原创 2020-12-11 10:24:55 · 900 阅读 · 1 评论 -
jvm类加载机制
过程如下图:加载、验证、准备、初始化、卸载这5步顺序是一定的。而初始化解析阶段可能在初始化之后。因为java支持运行时绑定一、加载阶段jvm会做下面的事情:通过类的全限定名取到类的二进制数据流 把字节流中的静态存储结构转换为方法区(元空间)中运行时的数据结构 生成一个java.lang.Class对象,作为入口供程序访问顺便说明一下,加载class文件的几种方式:从本地系统中加载class文件 通过网络加载class文件 从zip,jar等归档文件中加载class文件..原创 2020-11-27 14:37:28 · 1444 阅读 · 0 评论 -
java使用spring aop切面编程
aop概念1、切面(Aspect)首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类定义完成之后(封装)。每次实例化一个对象,对类定义中的成员变量赋值,就相当于对这个立方体进行了一个定义,定义完成之后,那个对象就在那里,不卑不亢,不悲不喜,等着被使用,等着被回收。面向切面编程则是指,对于一个我们已经封装好的类,我们可以在编译期间或在运行期间,对其进行切割,把立方体切开,在原有的方法里面添加(织入)一些新的代码,对原有的方法代码进行一次增强处理。而那些增强部分的代码,就被称之原创 2020-10-22 08:12:06 · 3307 阅读 · 0 评论 -
javaWeb之拦截器Intercepter
拦截器简介HandlerInterceptor 的功能跟filter类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行拦截器特点1、拦截器是基于java反射机制来实现的或是基于动态代理来实现的2、拦截器不依赖servlet容器。3、拦截器只对Action起作用。4、拦截器可以访问Actio.原创 2020-10-14 07:46:46 · 1502 阅读 · 0 评论 -
javaWeb之监听器Linenter
监听接口类HttpSessionListener 监听session的创建和销毁(一般用户统计网站在线人数) HttpSessionAttributeListener 监听session属性的新增和移除 ServletContextListener 监听servlet容器的启动和销毁 ServletContextAttributeListener监听servlet容器属性的新增和移除使用方法1、创建类实现上面的接口,添加@WebLinenter注解@WebListen...原创 2020-10-13 21:09:55 · 129 阅读 · 0 评论 -
javaWeb之过滤器Filter
过滤器(Filter)简介过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,主要可以拦截request和response过滤器是以一种组件的形式与web程序绑定,采用链式进行工作。过滤器的好处:可以拦截请求和响应,以便查看或者获取客户端与服务器之间的交互数据,实现过滤的功能。另外过滤器可以动态的添加或删除而不需要修改web程序的逻辑。过滤器的作用:过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个s原创 2020-10-13 20:57:26 · 346 阅读 · 1 评论 -
java使用spirng框架之spring security
spring security 核心功能认证 授权 攻击防护使用引入pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>有两种授权认证方式基于内存 基于数据库一、基于内存的认证1原创 2020-10-11 15:11:33 · 463 阅读 · 0 评论 -
java设计模式之单例模式singleton
单例模式的实现主要有以下四种一、饿汉模式public class LazySingleton { private static volatile LazySingleton instance; /** * 获取实例 * @return */ public static LazySingleton getInstance() { if(instance!=null){ synchronized (Lazy原创 2020-10-08 11:23:15 · 2899 阅读 · 3 评论 -
记一次生产环境Java服务synchronized死锁的处理过程
案例客户反馈网址响应太慢,有时直接无响应。仿佛卡死一般。驱动包:mysql-connector-java 5.1.32过程看的第一眼,感觉这个问题简单。响应慢,肯定是系统在进行full gc STW导致系统变慢。内存泄漏呗!1、查看java服务的堆栈情况使用阿里arthas工具查看,执行dashboard命令看样子不是在full gc,老年代虽说占用了80%,但是还不足以频繁full gc。2、随后查看tomcat日志tomcat启动增加了-ver..原创 2020-09-30 20:20:35 · 3338 阅读 · 0 评论 -
记一次生产环境java服务mqtt连接线程数过多的处理过程
项目介绍:本项目是负责发放机设备发放商品的平台。发放机设备是厂商控制,发放机平台是我们公司负责开发和维护。发放机设备和平台是通过mtqq协议通信的。mqtt开发客户端使用的是org.eclipse.paho.client.mqttv3-1.2.0.jar。mqtt服务器使用的是ActiveMQ。事件: 某日,客户反馈说项目不能正常访问了。我就要去linux服务器上查看日志,发现linux ssh连接后不能执行任何命令,报错-bash:fork:retry:no child proce..原创 2020-09-06 17:03:51 · 6084 阅读 · 7 评论 -
报错Java.Lang.OutOfMemoryError: PermGen Space三种解决办法
原因:当Java虚拟机需要加载定义的一个新class,但是在持久代中没有足够的空间就会抛出‘Java.Lang.OutOfMemoryError: PermGen Space’异常。默认分配给持久代的大小在server模式下是64MB ,在client模式下是32MB方法1:在ide中启动项目的时候在debug Configurations的Vm arguments参数设置中 添加-Xms5...原创 2020-02-16 11:16:10 · 1937 阅读 · 0 评论 -
BeanInstantiationException,bean实例化异常
缺少无参构造方法原创 2020-02-17 09:38:36 · 3953 阅读 · 0 评论