
java
文章平均质量分 73
zhangzhen02
这个作者很懒,什么都没留下…
展开
-
CopyOnWriteArrayList 与CopyOnWriteArraySet详解
CopyOnWriteArrayList一,类基本属性public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //可重入锁 final transient ReentrantLock lock = new ReentrantLock(); //底层是个volatile修饰的array private原创 2021-12-23 16:36:17 · 1648 阅读 · 0 评论 -
2020年Java面试题
并行流底层实现和问题底层使用forkjoinpool,默认线程数为核心数,拆分使用对半递归拆分。问题,1.同用一个池子,线程数有限,如果有IO阻塞任务,将会导致其他任务长时间等待。sql执行流程连接-查询缓存-语法解析器和预处理-查询优化器-执行计划-执行SQL连接:tcp连接,权限验证查询缓存:根据query进行hash运算,存储结果语法解析器和预处理:验证语法是否正确,库表字段是否存在查询优化器:基于成本选择成本最小的语句执行计划:生成查询的指令树执行sql: 调用存储引擎的API进原创 2020-08-27 10:12:37 · 256 阅读 · 0 评论 -
springcloud使用zipkin
1.首先搭建zipkin serverdocker run -d -p 9411:9411 openzipkin/zipkin通过http://localhost:9411/ 就可以看到zipkin页面了2.在springcloud中集成zipkin引入依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-z原创 2020-06-23 14:20:22 · 2231 阅读 · 0 评论 -
连接K8S中的apollo配置中心报错
使用apollo很简单1.添加依赖<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.1.0</version></dependency>2.添加配置app: id: ${APOLLO_APP_ID}apol原创 2020-06-08 16:39:10 · 650 阅读 · 0 评论 -
浅显易懂的AQS源码分析,并实现自定义锁
AQS是什么?AQS(AbstractQueuedSynchronizer)是Java中重要的同步框架。该框架实现了大部分的同步器功能,使使用者仅覆盖几个简单的方法就可以得到各种各样的同步器,包括ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,ThreadPoolExecutor等,当然也可以很简单的实现我们自己定义的同步器。从ReentrantLock说起。当我们使用一个ReentrantLock时Lock lock=ne原创 2020-06-04 14:49:11 · 205 阅读 · 0 评论 -
Atomic类怎么保证原子性的?有什么问题?
Atomic类是通过Unsafe类,实现的原子性。而Unsafe类是由native方法实现的。看下源码:public class AtomicInteger extends Number implements java.io.Serializable { public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }}Unsafe类public final原创 2020-06-02 16:45:33 · 1382 阅读 · 0 评论 -
Synchronized实现原理,以及偏向锁,轻量级锁,重量级锁都是什么?怎么升级的?
Synchronized实现原理一个对象在内存中分为对象头,实例变量,和对其填充。实例变量是用来存本对象的属性信息,对其填充使该对象保持占用8字节的整数倍。那对象头具体是什么呢?对象头分为三部分:MarkWord,指向类的指针,数组长度(只有数组对象才有)。那么问题就来了,MarkWord是什么?MarkWord存了对象跟锁有关的信息。这就是今天我们要讲的内容。具体见下图,64位虚拟机时。首先我们看重量级锁,标志为是10.储存了指向监视器monitor对象的指针,monitor对象是有C+原创 2020-06-02 15:20:07 · 1760 阅读 · 0 评论 -
netty是什么?有哪些组件?怎么使用?
netty是什么?netty是一个封装了NIO的网络应用的框架,是异步事件驱动的。用于帮助使用者快速开发高性能协议服务器。为什么要用netty?首先是Java原生的NIO接口并不是那么好用,没有经验的程序员也很难使用远程NIO构建出高性能的协议服务器。而且还有著名的selector空轮询bug。netty对NIO进行了封装,是接口更易用,解决了NIO的bug,使我们更方便地搭建一个高性能协议服务器。netty的特点有哪些?高并发,基于NIO,相比BIO并发性能高。传输快,netty传输依赖零拷原创 2020-06-01 21:16:19 · 800 阅读 · 0 评论 -
NIO是什么?怎么使用?存在什么问题?
NIO是什么?NIO是JDK1.4 java.nio.*包中引入的新的IO库,用来提高速度。有什么优势,为什么要用NIO?通过我的这篇文章5种IO模型的原理,我们知道非阻塞IO可以避免硬盘到内核空间的数据复制的阻塞,从而将CPU空闲出来用于其他操作。。而IO多路复用可以减少线程数,使用一个线程管理多个IO操作。这明显可以提高CPU的利用率。而NIO就是利用以上亮点,提高性能的。怎么使用NIO?操作文件示例package com.example.demo.nio;import java.io原创 2020-06-01 17:33:20 · 1215 阅读 · 1 评论 -
什么是零拷贝?在java中是怎么实现的?
一,零拷贝是什么?1.是什么?零拷贝是指cpu不参与数据在内存间的复制。2.有哪些好处?减少上下文切换,避免cpu数据拷贝带来的负载。3.怎么实现?DMA,mmap+write,sendfile,sendfile+DMA gather copy二,传统的IO的流程是什么?读文件:用户进程调用read()->发起系统调用->操作系统运行级别由用户态转化为内核态->CPU将磁盘缓冲区里的数据复制到内核缓冲区->CPU将内核缓冲区中的数据复制到用户缓冲区->操作系统由原创 2020-05-29 18:53:47 · 1309 阅读 · 0 评论 -
5种IO模型的原理
阻塞IO,非阻塞IO,IO多路复用是三种常见的IO模型。那么他们有什么区别?我下面以unix的实现过程来说明,他们的实现原理和区别。阻塞IO当进程(用户空间)调用recvfrom命令,其系统调用将会一直阻塞,直到recvfrom命令返回或执行过程报错。具体阻塞过程分为:等待数据到达内核空间,数据从内核空间复制到用户空间。非阻塞IO由于内核是否准备好数据,是可以通过recvfrom查询得到的,如果数据没有准备好,会返回一个错误EWOULDBLOCK,我们可以通过轮训该错误码来判断数据是否准备好,原创 2020-05-29 18:19:42 · 643 阅读 · 0 评论 -
spring bean的生命周期有哪些?有什么可扩展的?
spring bean 的生命周期在scope为单例模式下,spring bean的生命周期如下图1.首先实例化bean对象。如果是beanFactory容器,当客户请求一个尚未实例化的bean时,或需要依赖注入一个汕尾实例化的bean时,容器会通过调用createBean进行该bean的实例化。对于ApplicationContext容器,在容器启动结束后,就会实例化所有bean。容器通过调用beanDefinition获取bean信息进行实例化,此步骤仅仅是简单的实例化,并未进行依赖注入。原创 2020-05-25 16:43:35 · 520 阅读 · 0 评论 -
spring中bean循环依赖有哪些?spring都是怎么解决的?
循环依赖A依赖B,B又依赖A,导致循环嵌套。Spring中一共又三种循环依赖的现象。1.构造器中的循环依赖。直接报错2.单例scope下setter方法的循环依赖。使用三级缓存解决3.非单例scope的循环依赖。不解决,由用户处理。spring具体是如何处理的?1.构造器中的循环依赖。spring中存在一个正在创建对象的池子,创建对象时添加到该池子,this .singletonsCurrentlylnCreation.add(beanName)。创建完成从池子删除。试图创建某对象时,这样当原创 2020-05-14 20:31:26 · 328 阅读 · 0 评论 -
什么是AOP?有什么好处?怎么实现的?
什么是AOP?AOP(Aspect-Oriented-Programing)面向切面编程,是一种编程理念。该理念能够是那些为多个业务所共有,却与业务逻辑没有关系的模块抽取出来,形成一个切面。这样可以减少重复代码,并使业务逻辑保持简单,是代码易于维护和扩展。Spring中是怎么实现AOP的?Spring是通过动态代理和CGLib(Code Generation Library)字节码生成技术,来实现AOP的,默认在对象存在接口时,使用动态代理,否则使用CGLib。先看下静态代理public cla原创 2020-05-14 17:38:01 · 753 阅读 · 0 评论 -
到底什么是IoC?有什么好处?怎么实现的?
首先说下依赖倒置依赖倒置是种设计原则,把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。比如你要堆个积木,比如一个城堡,看看手里有一些完成的模块,来对城堡,就是城堡在依赖模块。即高层依赖底层。一旦子模块改变,你就要重新设计城堡了。如果这种层次较多,那修改起来肯定是个噩梦。而依赖倒置原则,即是根据城堡的设计图,设计子模块,子模块必须根据城堡设计图的要求设计,这样就是底层建筑依赖高层建筑了,也即是依赖倒置了。IoC 依赖反转,是依赖倒置原则下的一种设计思路,具体的实现方法就是依赖注入原创 2020-05-14 15:33:47 · 766 阅读 · 0 评论 -
ConcurrentHashMap源码分析及高频面试问题答案
类结构:public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable {继承自AbstractMap, 实现了ConcurrentMap接口。重要的变量//数组,即“桶” transient volatile Node<K,V>[] table; //扩容时新建的桶 private tra原创 2020-05-13 20:40:50 · 437 阅读 · 0 评论 -
说一下JAVA当中的异常结构
继承结构Throwable 是所有异常类的父类,它有两个重要的子类,Exception和Error。Error是指程序本身不能够处理的异常,一般表示JVM出现了问题,如堆溢出,栈溢出等。Exception 是指程序可以处理的异常。包含两个子类RuntimeException和IOException。RuntimeException 运行时异常,是指JVM常用操作引起的异常,比如其子类,数组越界异常,空指针异常等。IOException 是指跟IO操作有关的异常,有比如EOFException,F原创 2020-05-13 18:51:52 · 246 阅读 · 0 评论 -
一文说清Redis缓存击穿,雪崩,穿透,及解决办法
缓存雪崩缓存雪崩是指大量热点数据同时过期,导致请求直接落到数据库,对数据库造成巨大压力甚至宕机。解决方案:1.简单方案不让缓存同时过期。可以在过期时间上加一定范围的随机数,也可以将一些几乎不改变的数据设置为永远不过期。2.复杂方案分布式缓存+多个数据库,使请求尽可能分布在不通的redis 和mysql数据库中,在过期时间有限制的场景,也可以使用该方案,使多个库共同分担压力。缓存雪崩的事前事中事后的解决方案如下。事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。原创 2020-05-13 15:39:45 · 248 阅读 · 0 评论 -
boolean到底占几个字节?
在java 8种基本数据类型中,其中七种都有明确的长度,它们分别是,单位字节即8bit:byte 1short 2int 4long 8float 4double 8char 2对于boolean 类型呢,并没有定义。那么我们看java虚拟机规范:在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚原创 2020-05-12 21:06:14 · 3905 阅读 · 0 评论 -
TreeMap源码分析及高频面试问题答案
TreeMap实现了红黑树的结构,实现了有序map。继承结构public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.SerializableTreeMap继承自AbstractMap,实现了NavigableMap接口。1.AbstactMap实现了基本的map操作2.NavigableMap接口继承原创 2020-05-12 16:53:32 · 654 阅读 · 0 评论 -
@EntityGraph使用详解
测试时我使用三个类,类图如下实体图如下:@Entity@Table(name = "location")@NamedEntityGraphs({ @NamedEntityGraph(name = "default",attributeNodes = { @NamedAttributeNode(value = "country",subgraph = "country") }, subgraphs = { @NamedSubgraph(name原创 2020-05-12 10:27:13 · 7024 阅读 · 0 评论 -
hibernate+jpa+entityGraph实现懒加载的问题及解决方案
1.hibernate默认懒加载无效?hibernate默认对所有关联关系使用懒加载,但是在springboot使用的过程中,发现多对一,一对一的时候并未实现懒加载,具体问题请看这篇文章2.为什么不使用fetch = FetchType.EAGER或fetch = FetchType.Lazy?单独使用以上两种方式,有很大局限,该设置是写死的。对所有查询都返回一致的关联内容,问题是有些查询需要,有些查询不需要这些关联内容。都用迫切加载造成浪费,都有懒加载又无法满足一定时期的需要,比如使用缓存时。3.原创 2020-05-09 19:32:51 · 1038 阅读 · 0 评论 -
LinkedHashMap源码分析及高频面试问题答案
首先看继承结构public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>可以看到LinkedHashMap继承自 HashMap.成员变量transient LinkedHashMap.Entry<K,V> head;transient Linked...原创 2020-05-08 17:14:56 · 438 阅读 · 0 评论 -
使用hibernate 时发现one-to-one与many-to-one的默认不是懒加载
项目中使用到hibernate5,在one-to-one 及many-to-one时,发现不是懒加载。通过ide自动生成发现如下:默认改为急切加载了?于是查看hibernate5.2文档The Hibernate recommendation is to statically mark all associationslazy and to use dynamic fetching ...原创 2020-05-08 15:29:39 · 689 阅读 · 0 评论 -
HashMap源码分析及高频面试问题答案
首先看下继承结构public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable继承自AbstractMap,并实现了Map等方法。主要成员变量和一些常量 //默认初始容量16 static final int ...原创 2020-05-07 20:28:23 · 202 阅读 · 0 评论 -
LinkedList源码分析及高频面试问题答案
首先看下继承结构public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable继承自AbstractSequentialList,并实现了List,...原创 2020-05-07 13:32:25 · 140 阅读 · 0 评论 -
ArrayList源码分析及高频面试问题答案
一,首先看ArrayList 中的两个重要的变量transient Object[] elementData; //数组容量private int size; //实际存的元素个数下文将会频繁提及它们。二,看下构造方法构造方法1: public ArrayList(int initialCapacity) { if (initialCapacity > 0) {...原创 2020-04-30 17:00:55 · 203 阅读 · 0 评论 -
常用JPQL
Keyword Sample JPQL snippetAnd findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2Betwe...原创 2020-04-30 11:27:49 · 211 阅读 · 0 评论 -
JMM中happens-before 你了解多少?
什么是happens-before原则?从JDk1.5开始,JMM(java 内存模型)就是用happens-before原则来保证内存可见性。即,如果一个线程的操作的结果必须被另一个线程可见,那么他们必须符合happens-before原则。下面是happens-before原则规则:程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;锁定规则:一个un...原创 2020-04-29 22:19:37 · 170 阅读 · 0 评论 -
volatile的秘密
volatile有什么作用?1.内存可见性,即所有线程都能看到共享内存的最新状态2.防止指令重排。什么是内存可见性?每个线程都有自己的工作内存,所有线程共享主存。结构如下图:Java通过几种原子操作完成工作内存和主内存的交互:lock:作用于主内存,把变量标识为线程独占状态。unlock:作用于主内存,解除独占状态。read:作用主内存,把一个变量的值从主内存传输到线程的工作内...原创 2020-04-29 21:48:10 · 149 阅读 · 0 评论 -
几种单例模式及其优缺点
饿汉模式public class Singleton { private static Singleton instance=new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return instance; }}生成实例时间:...原创 2020-04-29 19:21:59 · 149 阅读 · 0 评论 -
String,StringBuffer,StringBuilder全面分析
三者区别是什么?总的来说:String 是个字符串常量,StringBuilder是一个非线程安全的字符串变量,StringBuffer是一个线程安全的字符串变量。源码分析:String是一个不可变的char[] 数组。源码如下:public final class String implements java.io.Serializable, Comparable<Stri...原创 2020-04-29 16:05:49 · 146 阅读 · 0 评论 -
自动装箱自动拆箱的实现原理
什么是自动装箱和自动拆箱?自动装箱就是Java自动将原始值类型转变为对应的对象,如int 自动转变为Integer的过程。自动拆箱则反之。Java是怎么实现自动装箱和拆箱的?测试代码如下:public class AutoPacking { Integer i1= 1; int i2=new Integer(2);}编译后,进行反汇编,得到代码如下:public ...原创 2020-04-29 15:06:35 · 648 阅读 · 0 评论 -
一文掌握ThreadLocal
一,ThreadLocal是什么?threadlocal是一个创建线程局部变量的类。通过该方法可以使一个对象变成该线程独享,从而实现线程安全。比如SimpleDateFormat 类是非线程安全的,我们使用ThreadLocal将其变成线程安全的对象。SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:...原创 2020-04-28 20:41:09 · 123 阅读 · 0 评论 -
强引用软引用弱引用虚引用使用场景与注意事项
强引用:生成方式:new 出来的对象。 Object object = new Object();释放时机:1.需要手动释放object=null;2.线程结束,只在本线程中的强引用会被gc标记为可回收。用处:想随时获取到该对象,不想被垃圾回收器gc收回,符合大部分应用场景。注意事项:注意集合类型中的强引用的释放问题,如:String strongReference = ...原创 2020-04-27 19:59:13 · 803 阅读 · 0 评论 -
jvm内存细颗粒的划分及含义
JVM区域细颗粒度划分《深入jvm虚拟机》一书中对jvm内存区域分为,堆,元空间,栈,直接内存,程序计数器。而事实上,jvm空间中的划分远远比这个要细。大致如下图。所以Java进程占用的最大内存为:old+eden+survivor_from+survivor_to+string_constant_pool+code_cache+metaspace+thread_stack+direct...原创 2020-04-15 15:23:01 · 406 阅读 · 0 评论 -
压测中TPS上不去的几大原因及解决办法
压测中TPS上不去的原因:1、网络带宽在压力测试中,有时候要模拟大量的用户请求,如果单位时间内传递的数据包过大,超过了带宽的传输能力,那么就会造成网络资源竞争,间接导致服务端接收到的请求数达不到服务端的处理能力上限。2、连接池可用的连接数太少,造成请求等待。连接池一般分为服务器连接池(比如Tomcat)和数据库连接池(或者理解为最大允许连接数也行)。(关于连接池的具体内容,可参考之前的博...原创 2020-04-13 20:27:29 · 15383 阅读 · 0 评论 -
使用jhat 排查OOM(内存溢出)
一,将dump文件下载到本地二,使用jhat生成分析页面,jhat ./dump.hprof三,打开页面浏览器打开页面http://localhost:7000/四,拉到最下面,点击instance count of classes可以看到bson相关有几十万个实例alarmMessage有十几万个实例,那么问题逐渐明了了。五,...原创 2020-04-09 12:02:34 · 3433 阅读 · 0 评论 -
Java实现验证码服务及字体下载问题的解决
因产品需要,为服务添加验证码,决定使用com.github.penggle的验证码生成服务。一,添加依赖: <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3...原创 2020-03-31 15:26:52 · 1047 阅读 · 0 评论 -
grpc 连接池实现
一,首先,grpc有没有必要实现连接池?测试及分析见前文:记一次web请求量上不去的排查记录,及grpc client请求优化二,如果我们确实需要实现自己的连接池,代码如下:1.首先引入apache的池化包 <dependency> <groupId>org.apache.commons</groupId> ...原创 2020-03-30 16:41:59 · 5492 阅读 · 0 评论