Java核心技术
文章平均质量分 66
技术砖家--Felix
I'm felix li
展开
-
如果线上遇到了OOM,该如何解决?
为什么会 OOMOOM 全称 “Out Of Memory”,表示内存耗尽。当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误为什么会出现 OOM,一般由这些问题引起分配过少:JVM 初始化内存小,业务使用了大量内存;或者不同 JVM 区域分配内存不合理代码漏洞:某一个对象被频繁申请,不用了之后却没有被释放,导致内存耗尽内存泄漏:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了。因为申请者不用了,而又不能被虚拟机分转载 2021-12-27 15:06:14 · 319 阅读 · 1 评论 -
设计一个秒杀系统之分布式事务
什么是分布式事务?如果概念都了解,请移步分布式事务的几种模式实现分布式事务时指会涉及多个数据库(服务)的事务,其实就是对同一数据库事务的概念扩大到对多个数据库(服务)的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定产生统一的结果(全部提交或全部回滚)。分布式事务背景数据库事务需要满足 ACID(原子性、一致性、隔离性、持久性)四个特性。原子性(Atomicity)指事务作为整体来执行,要么全部执行原创 2021-11-04 10:12:00 · 544 阅读 · 0 评论 -
设计一个秒杀系统之熔断降级
为什么需要降级在开发高并发系统时,有很多方法来保护系统,如:缓存、降级、限流等。下面将介绍一下降级的策略。当系统访问量增多,服务响应时间长或者非核心服务影响了核心服务的性能时。这是如果需要保证核心服务的可用性,就需要对非核心业务执行一些降级处理。系统可以根据关键数据进行自动降级,也可以配置开关进行人工降级。降级策略分类降级按照是否可以自动化分为:自动开关降级和人工开关降级。按照读写功能可以分为:读服务降级和写服务降级。当从用户访问的整条链路来看,将会有以下多级降级策略:页面降级:当在大促时,某原创 2021-10-29 09:42:06 · 426 阅读 · 1 评论 -
阿里规范:PECS (Producer Extends Consumer Super ) (<? extends T> 和 <? super T>)
阿里规范12.【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用 add 方法, 而<? super T>不能使用 get 方法,两者在接口调用赋值的场景中容易出错。具体的分析可以看下如下 :最终PECS (Producer Extends Consumer Super ) 原则频繁往外读取内容的,适合用上界Extends。经常往里插入的,适合用下界Super。<? extends T> 和 <? super T转载 2021-10-26 11:21:36 · 278 阅读 · 0 评论 -
HashMap为什么选择红黑树?
为什么不选择AVL树?RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree实现的功能都可以用AVL树是代替,那么为什么还需要引入RB-Tree呢?红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的原创 2021-10-12 15:20:15 · 3303 阅读 · 0 评论 -
CopyOnWriteArrayList分析
CopyOnWriteArrayList转载 2021-09-28 11:47:06 · 69 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁详解
ReentrantReadWriteLock读写锁详解转载 2021-09-28 11:39:11 · 73 阅读 · 0 评论 -
NIO和BIO的对比和理解
BIO同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会.原创 2021-09-13 13:40:43 · 352 阅读 · 0 评论 -
volatile关键字的原理以及使用方式
volatile的作用Java的volatile关键字用于标记一个变量“应当存储在主存”。更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取。每次写入一个volatile变量,应该写到主存中,而不是仅仅写到CPU缓存。变量可见性和volatile的可见性保证如果变量a没有声明volitale,如图中的变量a,线程a更改a的值后,并不能保证刷入主内存,就会出现cpu缓存和主内存不一致的情况,此时线程B来读取,可能会读取到线程A更改前的b。而如果声明为volatile,原创 2021-09-07 14:26:27 · 346 阅读 · 0 评论 -
JUC之Fork/Join使用详解
Fork/JoinFork/Join并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术。Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典型的用法如下:Result solve(Problem problem) { if (problem is small) { directly solve problem } else { split problem into independent parts fo..原创 2021-08-09 15:55:37 · 361 阅读 · 0 评论 -
Lock和Synchronized的对比和实现
Lock拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁Lock lock = new ReentrantLock(); lock.lock(); try { // ..} finally { lock.unlock();}注意:在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,会提前进行unlock导致IllegalMonitorSt原创 2021-08-05 15:16:55 · 232 阅读 · 0 评论 -
Stop-the-World(STW)
Stop-the-World,简称 STW,指的是 GC 事件/过程4发生过程当中停止所有的应用程序线程的执行。 这让我想起了我丈母娘对我喊 着: “我扫垃圾的时候你站在原地不要动”。垃圾回收器的任务是识别和回收垃圾对象进行内存清理。为了让垃圾回收器可以正常且高 效地执行,大部分情况下会要求系统进入一个停顿的状态。停顿的目的是终止所有应用程序的 执行,只有这样,系统中才不会有新的垃圾产生,同时停顿保证了系统状态在某一个瞬间的一 致性,也有益于垃圾回收器更好地标记垃圾对象。因此,在垃圾回收时,都会产生应用程原创 2021-07-20 15:36:16 · 654 阅读 · 0 评论 -
Full GC & Minor GC
Full GC & Minor GC新创建的对象都存放在年轻代。因为大多数对象很快变成引用不可达(死 亡〉,所以大多数对象在年轻代中创建,然后消失。当对象从这块内存区域消失时,我们说发 生了一次“MinorGC”,工作流程如图 所示,存活对象根据幸存区、老年代区间的实际大 小进行调整。存活下来的年轻代对象被复制到老年代。 老年代的内存区域一般大于年轻代。 因为它拥有更大的规模,为了提高系统整体性能,所以 GC 发生的次数比在年轻代的少。对象从老年代消 失时,我们说“M句orGC”或“Full原创 2021-07-20 11:54:30 · 108 阅读 · 0 评论 -
JVM老年代和年轻代
年轻代&老年代( Young Generation & Old Generation)年轻代:年轻代其实分为两部分,分别是1个Eden区和2个Survivor区(分别叫from和to),默认比例是8:1,一般情况下,新创建的对象都会被分配到Eden区,(除非一些特别大的对象会直接放到老年代),当Eden没有足够的空间的时候,就会触发jvm发起一次Minor GC,如果对象经过一次Minor GC还存活,并且又能被Survivor空间接受,那么将被移动到Survivor空间当中,对象在Survi原创 2021-07-19 15:51:17 · 959 阅读 · 0 评论 -
GC四种垃圾回收算法
引用计数(Reference Counting)算法引用计数算法在每个对象都维护着一个内存字段来统计它被多少”部分”使用—引用计数器,每当有一个新的引用指向该对象时,引用计数器就+1 ,每当指向该引用对象失效时该计数器就-1 ,当引用数量为0的时候,则说明对象没有被任何引用指向,可以认定是”垃圾”对象.由于只维护局部信息,所以不需要扫描全局对象图就可以识别并释放死对象;但也因为缺乏全局对象图信息,所以无法处理循环引用的状况。更高级的引用计数实现会引入“弱引用”的概念来打破某些已知的循环引用,但那原创 2021-07-19 15:48:33 · 854 阅读 · 0 评论 -
Java 的强引用、弱引用、软引用、虚引用
Java四种引用转载 2021-07-14 11:18:03 · 64 阅读 · 0 评论 -
GC对四种引用的区别(强,软,弱,虚)
强引用( Strong Reference }:在一个线程内,无需引用直接可以使用的对象,除非引 用不存在了,否则强引用不会被 GC 清理。我们平时声明变量使用的就是强引用,普通 系统 99%以上都是强引用,比如, Strings =”Hello World”。软引用( Soft Reference l : JVM 抛出 OOM 之前, GC 清理所有的软引用对象。垃圾 回收器在某个时刻决定回收软可达的对象的时候,会清理软引用,并可选地把引用存放 到一个引用队列(Reference Queue) , 类.原创 2021-07-14 10:55:49 · 3180 阅读 · 1 评论 -
从源码分析ConcurrentHashMap如何实现线程安全的?
concurrentHashMap如何实现线程安全的?转载 2021-06-10 17:32:56 · 93 阅读 · 0 评论 -
HashMap和ConcurrentHashMap的扩容过程详解
1. HashMap的扩容过程首先判断扩容,插入数据后,如果容量大于threshold(容量*负载因子),则进行扩容;获取当前容量,若当前容量大于0,并且大于MAXIMUM_CAPACITY = 1 << 30,则不进行扩容,将 threshold = Integer.MAX_VALUE进行赋值。否则创建新的数组,将容量进行两倍扩大,threshold也进行两倍扩容,下面截取部分源码; if (oldCap > 0) { if (oldCap原创 2021-06-04 15:26:27 · 1823 阅读 · 1 评论 -
JDK1.7和1.8中HashMap的区别?
JDK1.7和1.8中hashmap的区别?实现方式jdk版本数据结构1.7数组+链表1.8数组+链表+红黑树(节点数>=8并且数组 长度>=64转换为数组+红黑树)put方法JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法(尾插法需要遍历链表),头插法速度较高,但这种插入方法在并发场景下如果多个线程同时扩容会出现循环列表。1.8之后,链表长度到8之后就变成红黑树了,遍历的效率变高,采用尾插法效率也没多大影响,同时红黑树接口也不存在原创 2021-06-01 09:28:42 · 219 阅读 · 0 评论 -
hash冲突原理及解决方法?
hash冲突原理及解决方法?hash冲突原理及解决方法转载 2021-06-01 09:12:59 · 119 阅读 · 0 评论 -
利用swing写了一个随机点名小程序,超级实用!!!
利用swing做一个随机点名的小程序,可以添加姓名后点击查找,有一个查找的动态过程渲染的过程,最后停留在随机找到的那个人的框里代码mport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.List;import java.util.Random;原创 2021-05-27 15:44:44 · 928 阅读 · 1 评论 -
&(与运算)、|(或运算)、^(异或运算)的含义
按位与运算符(&)参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。另,负数按补码形式参加转载 2021-04-26 15:27:19 · 2320 阅读 · 2 评论 -
JRE和JDK的区别
定义JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具.转载 2021-04-23 17:04:46 · 120 阅读 · 0 评论 -
内存溢出和内存泄漏的区别、产生原因以及解决方案
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。内转载 2021-04-22 09:57:49 · 169 阅读 · 2 评论 -
lamda中stream的forEach与for循环对比
对比方式将一个字符串数组进行输出的方式:代码 public static void main(String[] args) throws IOException { int n=500000; String[] strings = new String[n]; Long streamStart = System.currentTimeMillis(); Arrays.stream(strings).forEach(System原创 2021-04-15 10:16:51 · 3182 阅读 · 1 评论 -
JVM原理分析
JVM原理jvm虚拟机有Classic VM:JDK1 与 JDK2 的官方默认虚拟机,世界第一种 java 虚拟机。通过纯解释器执行 Java 代码,即时编译器只能通过外挂的形式存在,并且不能与解释器一起运行。(那个时候的 Java 很慢)Exact VM:Sun 公司为了解决 Classic VM 的效率问题而计划研发的,但只在 Solaris 系统上发布过,后来就被 HotSpot 取代了因其使用准确式内存管理而闻名。(知道内存中某一块区域存放的是哪一种数据结构,有利于垃圾收集)HotS原创 2021-04-02 14:42:28 · 155 阅读 · 1 评论 -
MySQL如何使用索引
MySQL如何使用索引?索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高 SELECT 操作 性能的最佳途径。 查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那 么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。1.使用索引在 MySQL 中,下列几种情况下有可能使用到索引。 (1)对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用, 举例说明如下。 首先按company_id,moneys的顺序创建一原创 2020-08-24 17:19:17 · 1215 阅读 · 0 评论 -
通过 EXPLAIN 分析低效 SQL的执行计划
1,先看例子每个列的简单解释如下: select_type:表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接 或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或 者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。 table:输出结果集的表。 type:表示表的连接类型,性能由好到差的连接类型为 system(表中仅有一行,即 常量表)、const(单表中最多有一个匹配行,例如 primary key原创 2020-08-24 16:29:30 · 254 阅读 · 0 评论 -
Mysql面试题大全
1、SQL中聚合函数有哪些?聚合函数是对一组值进行计算并返回单一的值的函数,它经常与select语句中的group by子句一同使用。● avg():返回的是指定组中的平均值,空值被忽略。● count():返回的是指定组中的项目个数。● max():返回指定数据中的最大值。● min():返回指定数据中的最小值。● sum():返回指定数据的和,只能用于数字列,空值忽略。2、SQL之连接查询(左连接和右连接的区别)?● 外连接:● 左连接(左外连接):以左表作为基准进行查询,左表数据会全原创 2020-08-20 15:42:40 · 1144 阅读 · 0 评论 -
Java中集合类问题
1、HashMap排序题已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类型为 HashMap<Integer,User>,要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。注意:要做出这道题必须对集合的体系结构非常的熟悉。原创 2020-08-19 14:10:46 · 372 阅读 · 0 评论 -
Java中IO的一些问题
1、Java 中有几种类型的流?按照流的方向:输入流(inputStream)和输出流(outputStream)按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)按照处理数据的单位: 字节流和字符流。字节流继承于 InputStream 和 Outpu原创 2020-08-19 13:56:47 · 208 阅读 · 0 评论 -
Java基本数据类型问题
1、Java 的基本数据类型都有哪些各占几个字节?按照口诀记忆:● 数据类型:byte short int long float double boolean char● 占用字节数:12484812(byte对应1,short对应2,以此类推)2、String 是基本数据类型吗?通过JDK源代码可以看到,Stirng是class,是引用类型,底层用 char 数组实现的。3、short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗?前者原创 2020-08-19 11:04:39 · 310 阅读 · 0 评论 -
Java异常详解
1、final、finally、finalize 的区别?● final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。● finally:异常处理语句结构的一部分,表示总是执行。● finalize:Object 类的一个方法,所以Java对象都有这个方法,当某Java对象没有更多的引用指向的时候,会被垃圾回收器回收,该对象被回收之前,由垃圾回收器来负责调用此方法,通常在该方法中进行回收前的准备工作。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该原创 2020-08-19 10:49:45 · 266 阅读 · 0 评论 -
Java面向对象问题
1、面向对象包括哪些特性,怎么理解的?(1)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。(2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了原创 2020-08-18 18:57:01 · 167 阅读 · 0 评论 -
JavaSE基础问题
1, & 和 && 的区别?&运算符是:逻辑与;&&运算符是:短路与。&和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达式是一定会执行的。这就是他们俩的本质区别。3、两个对象值相同equals结果为true,但却可有原创 2020-08-18 18:54:39 · 159 阅读 · 0 评论 -
Java中关于String,StringBuilder,StringBuffer的一些问题
1、String类可以被继承吗?String类在声明时使用final关键字修饰,被final关键字修饰的类无法被继承。接下来我们可以看一下String类的源代码片段:public final class String implements java.io.Serializable, Comparable<String>,CharSequence { /** The value is used for character storage. */ private fin原创 2020-08-18 18:35:30 · 230 阅读 · 0 评论 -
实体对象转化xml
将实体对象User转换成Xml格式。实体类Userpackage com.example.webservice.demo.service.server;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.ann...原创 2020-01-07 19:06:28 · 293 阅读 · 1 评论 -
Springboot集成webservice介绍
什么是Web Services?Web Services 是应用程序组件Web Services 使用开放协议进行通信Web Services 是独立的(self-contained)并可自我描述Web Services 可通过使用UDDI来发现Web Services 可被其他应用程序使用XML 是 Web Services 的基础它如何工作?基础的 Web Services 平...原创 2020-01-07 18:17:37 · 527 阅读 · 0 评论 -
AspectJ简介以及在IntelliJ IDEA下的配置
转载自:https://blog.csdn.net/gavin_john/article/details/80156963转载 2020-01-02 13:27:56 · 646 阅读 · 0 评论