自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(340)
  • 资源 (6)
  • 收藏
  • 关注

原创 12 内存溢出的类型及解决思路

jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)Heap space(堆区域)Java Stacks(Java栈)第一种OutOfMemoryError: Permanent Generation space产生原因是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够。解决:增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久代

2020-08-12 23:55:54 258

原创 14 如何多个线程按顺序执行

如何控制多线程的执行顺序?方法一:使用join()方法让一个线程强制运行调用一个线程的join()方法就可以让这个线程强制运行,并且它会阻塞主线程的运行。原理:调用join方法,会调用join(0)方法,当参数为0时,会调用wait方法,使主线程阻塞,等待子线程执行完毕后,主线程结束等待,继续执行。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。public static void main(String[] args) {try {

2020-08-12 21:48:06 5153

原创 09 Java 的 IO

IO种类从数据传输方式可以将IO分为字节流和字符流:字节流:InputStream输入流,OutputStream输出流字符流:Reader输入流,Writer输出流如何选择:对于频繁处理字符串的情况,选择字符流会好一些,因为字符流具备缓冲区,提高了性能。缓冲区是一块特殊的内存区域,通过将数据缓存在缓冲区,之后直接从中读写,可以显著提高性能,字符流的操作都是在缓冲区进行的。字节流的操作不会经过缓冲区,而是直接操作文本本身。BIO同步阻塞式IO模型: 服务端的线程会一直阻塞等待客户端发起请求

2020-08-10 23:56:10 187

原创 06 MQ重复消费 顺序消费

重复发送消息,怎么保证消息不被重复消费呢?让消费消息的操作具有幂等性,一个操作具有幂等性是指这个操作任意多次执行所产生的影响与一次执行的影响相同。具体的实现有:利用数据库的唯一约束实现幂等每当要消费一条消息时,就先将其插入到数据库中,由于唯一性约束,相同的消息只会被插入一次。利用redis的SETNX命令也可以你是怎么保证消息按顺序消费?RocketMQ一个topic可以有多个分区,它可以分区中顺序消费,但是不能保证每个topic顺序消费,如果想要保证每个topic顺序消费的话,那么就只为一

2020-08-10 13:54:03 268

原创 05 MQ高可用

重复发送消息,怎么保证消息不被重复消费呢?让消费消息的操作具有幂等性,一个操作具有幂等性是指这个操作任意多次执行所产生的影响与一次执行的影响相同。具体的实现有:利用数据库的唯一约束实现幂等每当要消费一条消息时,就先将其插入到数据库中,由于唯一性约束,相同的消息只会被插入一次。利用redis的SETNX命令也可以你是怎么保证消息按顺序消费?RocketMQ一个topic可以有多个分区,它可以分区中顺序消费,但是不能保证每个topic顺序消费,如果想要保证每个topic顺序消费的话,那么就只为一

2020-08-10 13:52:16 104

原创 04 MQ消息积压怎么处理

消息积压你是怎么处理的?设计系统时,要保证消费端的消费性能要高于生产者的发送性能,这样系统才能健康持续运行。消息积压产生的原因有2种:第一是消息生产速度过快,另一种是消息消费速度变慢。可以通过查看消息队列内置的监控数据,确定是生产端还是消费端的原因。如果是消费端的原因,就进行消费端性能优化:首先可以优化消费业务逻辑,尽量减少冗余。还可以增加消费端的并发数,也就是扩容Consumer实例,也必须同步扩容主题中的队列数量,确保Consumer的实例数量和队列数量相等。如果是有大促或者抢购导致消息突增

2020-08-10 13:51:45 1223

原创 03 MQ怎么保证消息不丢失

检测消息是否丢失的办法可以利用消息队列的有序性来验证是否有消息丢失。Producer端在发消息时给每个消息附加一个连续递增的序号,然后在Consumer端来检查这个序号的连续性来判断是否有消息丢失,还可以通过缺失的序号来判断丢的是哪条消息。但是要注意的是像Kafka和RocketMQ这样的消息队列,是不保证在topic上的有序的,只能保证分区上是有序的,所以再发消息时必须指定分区并按区分别编号,并且检测时也要分区单独检测消息的连续性。RocketMQ如何保证消息不丢失的?如何保证可靠性的?一条消

2020-08-10 13:51:12 153

原创 02 MQ模型 事务消息

消息队列模型:①队列模型(点对点):生产者-消费者,一条消息只能被一个消费者消费到②发布订阅模型:发布者-订阅者。RocketMQ模型(Kafka模型也是一样的)RocketMQ中有生产者、消费者、主题等概念,每个主题可以包含多个队列,通过多个队列来实现并行生产和消费。这种情况下,只能在队列上保证消息的有序性,在主题层面无法保证消息顺序消费。RocketMQ中使一条消息能被多个消费者消费是通过消费组来实现的。在一个消费组中的多个消费者不能消费同一条消息,(同一个组内的消费者是竞争消费关系)但是一

2020-08-10 13:50:38 203

原创 01 MQ作用、种类、选型

为什么要使用消息队列?消息队列的好处?用途?消息队列用来解决系统之间的通信问题,主要功能就是收发消息,使用消息队列有几个好处:解耦:减少了系统之间的依赖关系,如果在一个系统A中直接调用另一个系统B的接口,如果B执行失败,A也会执行失败,两个系统高度耦合,不利于代码的扩展和维护。异步:提高系统响应速度,减少用户的等待时间。举例:假设我现在有一个下单功能,它包含了锁定库存,订单入库,给用户发短信3个操作,需要等这3个操作完成后才能给用户返回结果,用户需要等待较长的时间。我可以这样优化,在我这个下单功能中

2020-08-10 13:49:48 101

原创 15 其他问题

4. 如何控制多线程的执行顺序?join方法CountDownLatchCyclicBarrier利用并发包里的Executors的newSingleThreadExecutor产生一个单线程的线程池5. 三个线程如何实现交替打印ABC6. 操作系统进程间通信方式?管道、FIFO、消息队列、信号量、共享内存区7. 线程间通信方式?在java中,多个线程是通过写-读内存中的公共资源进行通信的。8. 线程交互方式?wait()、notify()9. 怎么控制线程尽可能减少上下文切换?

2020-08-09 00:15:25 77

原创 13 线程常用方法

1. wait和notify涉及3个方法:wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的线程notifyAll():一旦执行此方法,就会唤醒所有被wait的线程说明:1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中2.wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或同步

2020-08-09 00:14:55 125

原创 12 sleep wait区别 notify

1. wait和sleep区别相同点:一旦执行方法,都可以使得当前线程进入阻塞状态sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法。sleep是线程类的方法,wait是Object类的方法。sleep()可以在任何需要的场景下调用。wait必须使用在同步代码块中如果两个方法都在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁sleep()必须捕获异常,wait()方法、notify()方法和notiftAll()方法不需要捕获异常

2020-08-09 00:14:20 195

原创 11 线程生命周期状态

1.线程的生命周期(5种状态)在线程的生命周期中,它会经过新建(New)、就绪(Running)、阻塞(Blocked)和死亡(Dead)五种状态。由于CPU在多条线程之间切换,于是线程状态会多次在就绪和运行之间切换新建状态:当程序使用 new 关键字创建一个线程后,该线程就处于新建状态,此时它仅仅由Java虚拟机分配内存,并初始化其成员变量的值。程序只能对新建状态的线程调用一次 start() 方法。就绪状态:当线程对象调用 start() 方法后,该线程并没有马上执行而是进入就绪状态,Java虚

2020-08-09 00:13:49 120

原创 14 Redis的IO多路复用模型

Redis是跑在单线程的,所有的操作都是按顺序线性执行的,由于读写操作需要等待用户输入或者输出是阻塞的,所以某一个文件I/O阻塞会导致整个进程无法对其他客户提供服务,I/O多路复用就是为了解决这个问题而出现的。阻塞I/O 当对某个文件描述符进行读写时,如果当前文件描述符不可读或者不可写,那么线程就会阻塞在那里,无法对其他操作做出相应。导致整个服务不可用。所以在需要处理多个客户端任务时,往往不会用阻塞模型。在I/O多路复用模型中,有几个很重要的函数,比如select、poll、epoll,这些函数能够同时

2020-08-09 00:12:42 126

原创 13 Redis并发竞争key问题及解决

1.并发竞争key的场景多个请求一起去对某个商品减库存,通常操作流程是:取出当前库存值计算新库存值写入新库存值由于这三部不是原子操作,有多个线程一起操作,数据会不一致。有3个请求有序的修改某个key,按正常顺序的话,数据版本应该是 1->2->3,最后应该是3。但如果第二个请求由于网络原因迟到了,数据版本就变为了 1->3->2,最后值为 2,出问题了。2. 解决使用Redis事务和watch命令: watch命令会监视给定的每一个key,当 exec 时如果监

2020-08-09 00:12:10 294

原创 12 HotKey问题

redis的hotkey如何处理?hotkey问题:就是瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务的情情况怎么发现:凭借业务经验,进行预估哪些是热key。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。在客户端进行收集,这个方式就是在操作redis之前,加入一行代码进行数据统计。那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息。缺点就是对客户端代码造成入侵。在Proxy层做收集,但是缺点很明显,并非所有的redis集群架构都有pr

2020-08-09 00:11:32 477

原创 10 线程实现方式 execute submit

1. Java中多线程有哪几种实现方式?继承 Thread 类并重写run方法实现Runnable接,重写run方法实现 Callable 接口,通过FutureTask包装器来创建Thread线程通过线程池创建线程1.1继承 Thread 类并重写run方法java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承 java.lang.Thread 类或者直接调用Runnab

2020-08-08 21:11:26 197

原创 09 进程 线程区别

1. 线程和进程的定义进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程是进程的一个执行路径,一个进程中至少有一个线程。线程是CPU资源分配的基本单位。进程中的多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。2. 线程和进程的区别?进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位进程之间的切换会有较大的开销,线程可以看做轻量级的进程,线程的切换和调度远远小于进程。系统在运行的时候会为每个进程分配不同的内存空间,而同一个

2020-08-08 21:10:53 73

原创 08 同步异步 阻塞非阻塞 并行并发

1.同步和异步的区别?同步方法调用后,调用者必须等到方法调用返回后,才能继续后续行为。异步方法调用发出后,调用者不需要等待返回结果,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程。2.并行和并发的区别?并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事并发:一个CPU(采用时间片)同时执行多个任务。比如:多个人同时做一件事并行是指当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU

2020-08-08 21:10:21 75

原创 07 死锁

1. 什么是死锁?什么情况会发生死锁?线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行,就会产生死锁。饥饿是指线程因为种种原因无法获取所需要的资源,导致线程一直无法执行。2. 死锁产生原因系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。3. 死锁的前提(4个必要条件)互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程

2020-08-08 21:09:45 95

原创 06 ThreadLocal countdownLatch cyclicBarrier

1. 线程的局部变量是什么?线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。2. ThreadLocal是什么?ThreadLocal原理?ThreadLocal是解决多线程的并发问题的一种方式,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程

2020-08-08 21:09:15 72

原创 05 CAS

1. 什么是悲观锁、乐观锁?乐观锁执行操作前认为不会导致冲突,操作数据时,不进行任何特殊处理,在进行更新后,才会去判断是否有冲突。悲观锁操作数据时,认为操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作。2. 悲观锁和乐观锁(CAS)应用场景?乐观锁适用于资源竞争较少的情况下,也就是冲突很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,用悲观锁比较合适。3. CAS是什么(原理)?是线程安全的不?有什么问题?CAS是compar

2020-08-08 21:08:38 200

原创 04 线程池

1. 为什么要用线程池创建线程和回收线程都会占用系统资源,如果任务来了才创建线程那么响应时间会变长。因此,需要提前创建一些线程,这些线程交给线程池管理。这样可以降低资源消耗,提高响应速度,提高线程的可管理性。2. 线程池参数的意义corePoolSize:表示核心线程池的大小。当提交一个任务时,如果当前线程池的线程个数没有达到corePoolSize,则会创建新的线程来执行所提交的任务,即使当前核心线程池有空闲的线程。如果当前核心线程池的线程个数已经达到了corePoolSize,则不再重新创建线程

2020-08-08 21:08:04 82 1

原创 03 ReentrantLock

1. 什么是重入锁?有哪些可重入锁?重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层可以再次获取同一个锁,并且不发生死锁,这样的锁就叫做可重入锁。synchronized、ReentrantLock、ReentrantReadWriteLock2. ReentrantLock(Lock)实现原理?(写的不好)ReentrantLock(Lock)主要依靠volatile的state变量和CAS乐观锁来保证线程安全,使用AQS来管理等待的线程。3. AQS是什么?底层实现? 同步队列,

2020-08-08 21:07:21 59

原创 02 volatile

关键字volatile1.多线程的三个特性?原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。可见性:是指当一个线程修改了某一个共享变量的值,其他线程能够立即知道这个修改。有序性:在并发时,程序的执行可能会出现乱序。有序性问题的原因是因为程序在执行时,可能会进行指令重排,重排后的指令与原指令的顺序未必一致。2.产生线程可见性的原因?保证线程可见性有哪些方法每个线程都在自己的缓存中保存着共享变量的副本,一个线程对共享变量进行更改,其他线程

2020-08-08 21:06:50 76

原创 01 synchronized

对锁的理解由于在多线程环境下对共享变量进行修改会产生数据不一致的问题,所以就需要需要用到锁来保证线程安全(做同步)(同步:一个线程在对共享变量进行操作时,其他线程都不可以对这个共享变量进行操作,直到该线程完成操作)。而同步的本质是通过锁来实现的。锁是一种抽象的概念,实际上它是一个标记。为了实现每次只能有一个线程进入代码块,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记。这个

2020-08-08 21:05:46 90

原创 08 集合总结

HashTable底层是数组+链表,初始容量是11,负载因子0.75,扩容2倍+1,头插法,采用的Entryint hash = key.hashCode();//object的hashcode方法// 为啥要把hash值和0x7FFFFFFF做一次按位与操作呢, // 主要是为了保证得到的index的第一位为0,也就是为了得到一个正数。 // 因为有符号数第一位0代表正数,1代表负数int index = (hash & 0x7FFFFFFF) % tab.length;.

2020-08-07 00:23:46 68

原创 07 Collection和Map结构

两大类:Collection,存储对象的集合;Map,存储键值对一. Collection1. SetTreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 为 O(logN)。HashSet:基于哈希表实现,支持快速查找,不支持有序性操作。2. ListArrayList: 基于动态数组实现,支持随机访问。LinkedList: 基于双向链表实现,只能顺序访问,但是

2020-08-07 00:23:15 94

原创 06 红黑树 平衡二叉树

1. 什么是红黑树?红黑树是一种自平衡的二叉查找树:节点要么是黑色,要么是红色。根节点为黑色。叶子节点都是黑色的空节点。(叶子节点不存储数据)红色节点的左右孩子都是黑色。保证了从根节点到叶子节点不会出现连续两个红色节点。从任意节点到它每个叶子节点的所有路径,都包含相同数量的黑色节点。保证了没有一条路径会比其他路径长出两倍。时间复杂度为 logn ,含n个节点的红黑树高度最多为 2log(n+1) 。红黑树的左右旋:  左旋就是将这个旋转节点作为他右孩子的左孩子,原本他右孩子的左孩子作为

2020-08-07 00:22:43 98

原创 05 ArrayList LinkedList CopyOnWriteArrayList

1. ArrayList基于数组实现,实现了 List 接口。(允许传入空值和重复元素)当添加元素数量大于数组容量时,通过1.5倍的扩容机制进行扩容。实现了 RandomAccess 接口,表明它具有随机访问的能力,RandomAccess 接口里其实什么内容都没有,它只是一个标识,ArrayList 能实现随机访问真正依靠的是基于数组实现的底层结构。新增和删除操作会造成数组元素的移动,时间复杂度为 O(n)。由于支持随机访问,所以get和set操作的效率很高,时间复杂度为 O(1)。所以 Arr

2020-08-07 00:22:10 142

原创 04 LinkedHashMap TreeMap ConcurrentSkipListMap

1. LinkedHashMap如何实现有序访问?  LinkedHashMap继承了HashMap,但比 hashMap 多维护了一个双向链表,它的内部Entry除了保存当前对象的引用外,还保存了before和after两个引用,从而在哈希表的基础上又构成了双向链表。这样就能按照插入的顺序遍历元素。LinkedHashMap可以用于实现 LRU 缓存。LRU手撕2. TreeMap  TreeMap是基于红黑树实现的,时间复杂度是 logn,还可以保证键的有序性3. ConcurrentSkipL

2020-08-07 00:21:37 365

原创 03 ConcurrentHashMap

1. ConcurrentHashMap1.7和1.8版本实现原理JDK1.7分段锁:1.7中,ConcurrentHashMap是由一个Segment数组和多个HashEntry数组组成,Segment数组中每一个元素存储的是HashEntry数组和链表,当对HashEntry数组的数据进行修改时, 必须首先获得与它对应的Segment锁。多个线程可以同时访问不同的Segment,从而使并发度提高,并发度与 Segment 的数量相等JDK1.8Synchronized 和 CAS:1.8中,

2020-08-07 00:21:05 152

原创 02 HashMap

1. HashMap的底层数据结构HashMap底层是数组+链表+红黑树的结构,其中红黑树是JDK1.8加入的,数组中的每个位置存放的是节点,1.7中叫Entry,1.8中叫Node。每一个节点都会保存自身的hash值、key、value、以及next指针。在put操作时,将元素的key的hashCode 值的高16位和低16位异或得到key的 hash 值,然后将key的 hash 值和数组长度 length -1 的值进行与运算来得到元素所在桶的位置。如果出现冲突,即多个元素对应到一个桶,就采用拉

2020-08-07 00:20:35 235

原创 01 List、Map、Set HashSet

1. Java集合了解哪些?介绍一下有List、Map、Set三大类List可以有重复的元素,是有序的数据结构。实现类有ArrayList、LinkedList、CopyOnWriteArrayList、Vector等Map存储的是键值对,两个 key 可以引用相同的对象,但 key 不能重复。实现类有HashMap、HashTable、TreeMap、LinkedHashMap、ConcurrentHashMap等Set不能有重复的元素,是无序的数据结构。实现类有HashSet、TreeSet等

2020-08-07 00:19:28 90

原创 13 New一个对象的过程

new一个对象时发生了什么?首先会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。创建对象在堆区分配对象需要的内存:分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量。对所有实例变量赋默认值:将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值。执行实例初始化代码:初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法如果有类似于Cat c = new Cat()形式的c引用的话

2020-08-06 11:53:20 143

原创 11 内存泄露

1. 内存泄漏怎么引起的?内存泄漏是指无用对象 持续占有内存,内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。2. 内存泄漏的场景?单例模式可能会造成内存泄露。因为单例的静态特性使得它的生命周期和应用的生命周期一样长,如果单例对象拥有另一个对象的引用,那么在整个应用程序的生命周期里这个对象都不能被正常回收,从而导致内存泄露。解决办法是将这个对象改为全局的上下文。ThreadLocal3. 举个内存泄漏的例子?public E pop(){ if(size == 0)

2020-08-06 11:50:09 217

原创 10 JVM调优、GC优化

1. JVM调优由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代。实际项目中可以通过 -XX:+PrintGCDetails 来打印查看GC的详细日志,然后根据日志分析新生代空间大小分配是否合理,通过 -Xmn 命令调节新生代的大小,最大限度降低新对象直接进入老年代的情况。虽然大部分情况下,将对象分配在新生代是合理的,但对于大对象,如果首次就在新生代分配,可能会出现新生代空间不足导致很多年龄不够的小对象被分配到老年代,从而破坏了新生代的结构。因此,对于大对象,可以通过

2020-08-06 11:49:47 111

原创 09 对象进入堆到被回收的过程

1. 一个对象从进入堆区到死亡的全流程首先创建一个对象,将其放入新生代的eden区域,如果对象太大,就会直接将其分配在老年代中。可以通过参数-XX:PretenureSizeThreshold 设置直接进入老年代的对象大小。现在假设对象被存放在eden区,经过一段时间,这个对象的年龄增加到一定的临界值时,就会晋升到老年代中。可以通过这个参数-XX:MaxTenuringThreshold:设置进入老年代对象的年龄。年龄的计算方式: 虚拟机给每个对象定义了一个对象年龄计数器,对象在Eden出生,经过一次M

2020-08-06 11:47:06 232

原创 08 新生代和老年代

1. 新生代和老年代的区别?新生代:一般占据堆的 1/3 空间。用来存放新生的对象,新生代对象朝生夕死,对象存活率低,新生代MinorGC非常频繁,一般回收速度也比较快。新生代常采用 复制算法。老年代:主要存放应用程序中生命周期长的内存对象。老年代对象存活率高。老年代MajorGC经常会伴随至少一次的 MinorGC,老年代MajorGC 的速度比较慢。老年代常采用的 标记-清除算法和标记-整理算法。2. 什么样能够从新生代到达老年代?Eden区满时,进行Minor GC,当Eden和一个Su

2020-08-06 11:46:32 1277

原创 07 垃圾收集器

1. Java垃圾收集器有哪些?常见垃圾回收器原理?Serial收集器 & Serial Old收集器:这个组合是Client模式下的默认垃圾收集器。(通过-XX:+UseSerialGC强制开启)serial作用于新生代,采用复制算法。serial old作用于老年代,采用标记整理算法。优点:它们都是单线程收集器,少了多线程切换的开销,相较于其他收集器能够更加专注于垃圾回收,在单核场景下效率极高,在回收较小内存(大概100兆左右)时,停顿时间是毫秒级的。缺点:由于单线程运行,整个GC阶

2020-08-06 11:46:00 77

redis desktop manager Mac版本 dmg格式 和redis包

redis desktop manager Mac版本 dmg格式 和redis包,亲测可用,如有问题请联系我

2019-05-06

springMVC的学习代码

springMVC学习,哈哈哈哈

2019-04-21

spring学习代码

spring学习代码

2019-04-21

tensorflow-infogan

tensor infogan项目

2019-04-21

msrcnn项目

maskrcnn去雨项目。

2019-04-21

DCGAN人脸生成项目

DCGAN人脸生成项目。

2019-04-21

空空如也

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

TA关注的人

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