自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Jimoer

心中有光,人生总会晴朗。

  • 博客(42)
  • 收藏
  • 关注

原创 深入理解JVM(③)JVM运行时数据区域

前言Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时机,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的穷的和结束而建立和销毁。Java虚拟机将其管理的内存分为以下几个运行时区域。程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机...

2020-03-22 23:02:49 229

原创 春节做的2021年终总结

2021年对我来说是波折多事的一年,这一年经历了很多,终于在能在过年放假的时候抽出时间来写一下年终总结了。无论是在工作还是生活上都经历不少的波折。来吧,流水账开始了

2022-02-01 16:57:39 6794

原创 Elasticsearch写入数据的过程是什么样的?以及是如何快速更新索引数据的?

前言最近面试过程中遇到问Elasticsearch的问题不少,这次总结一下,然后顺便也了解一下Elasticsearch内部是一个什么样的结构,毕竟总不能就只了解个倒排索引吧。本文标题就是我遇到过的两个问题,所以此次基本上只是围绕着这两个问题来总结。ES写入数据在介绍写入数据的过程时,先明确一下ES中的一些关键性的概念:Clouster:集群,由一到N个Elasticsearch服务节点组成。Node:节点,组成Elasticsearch集群的基本单元,单个集群内节点名称唯一。通常一个节点中分配

2021-11-18 23:04:13 1784 4

原创 你说说RPC的一个请求的流程是怎么样的?

前言面试的时候经常被问到RPC相关的问题,例如:你说说RPC实现原理、让你实现一个RPC框架应该考虑哪些地方、RPC框架基础上发起一个请求是怎样一个流程等等。所以这次我就总结一波RPC的相关知识点,提前说明一下,本篇文章只是为了回答一些面试问题,所以只是解释原理,并不会深入挖掘细节。注册中心RPC(Remote Procedure Call)翻译成中文就是远程过程调用\color{red}{远程过程调用}远程过程调用。RPC框架起到的作用就是为了实现,调用远程方法时,能够做到和调用本地方法一样,让开发

2021-11-04 16:40:30 1436

原创 用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue

前言用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的。当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容。回头想想,自己真是一个大傻X,也只有我才会这么设计一个阻塞队列(再说,我这也不是阻塞的队列)。结果自己面试完之后,也没去总结这部分知识,然后过了一段时间,某教育机构的面试又被问到类似的问题了,只不过是换了一个形式,“请用wait方法和notify方法实现一套有生产者和消费者的这种逻辑”。然后我就又蒙圈了,追悔莫

2021-06-15 18:32:07 1467 2

原创 Java中的线程池用过吧?来说说你是怎么理解线程池吧?

前言Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了。我甚至这次标题都想写成【Java八股文之线程池】,但是有点太俗套了。虽然,线程池是一个已经被说烂的知识点了,但是还是要写这一篇用来加深自己的印象,但是想使用一个特殊的方式写出来。线程池使用线程池的目的先说一下我们为什么要使用线程池?线程是稀缺资源,不能频繁的创建。而且创建和销毁线程也是比较耗资源的。为了做到解耦,线程的创建与执行任务分开,方便对线程进行维护。为了复用,前面也说了创建和销毁线程比较耗资源

2021-05-06 07:03:54 298 1

原创 MySQL的半同步是什么?

前言年后在进行腾讯二面的时候,写完算法的后问的第一个问题就是,MySQL的半同步是什么?我当时直接懵了,我以为是问的MySQL的两阶段提交的问题呢?结果确认了一下后不是两阶段提交,然后面试官看我连问的是啥都不知道,就直接跳过这个问题,直接聊下一个问题了。MySQL的主从复制我们的一般在大规模、高性能的项目上,都是使用MySQL的复制功能来创建MySQL的主从集群的。主要是可以通过为服务器配置一个或多个备库的方式来进行数据同步。复制的功能不仅有利于构建高性能应用,同时也是高可用、可扩展性、灾难恢复、备份

2021-04-18 15:41:59 813 1

原创 Java实现十个经典排序算法(带动态效果图)

排序算法是老生常谈的了,但是在面试中也有会被问到,例如有时候,在考察算法能力的时候,不让你写算法,就让你描述一下,某个排序算法的思想以及时间复杂度或空间复杂度。我就遇到过,直接问快排的,所以这次我就总结梳理一下经典的十大排序算法以及它们的模板代码。算法分析一个排序算法的好坏,一般是通过下面几个关键信息来分析的,下面先介绍一下这几个关键信息,然后再将常见的排序算法的这些关键信息统计出来。名词介绍时间复杂度:指对数据操作的次数(或是简单的理解为某段代码的执行次数)。举例:O(1):常数时间复杂度

2021-03-14 13:15:13 1439

原创 你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?

前言

2021-03-01 08:32:33 355 1

原创 迟到的2020年终总结:责任与能力

其实很早就想写一篇年终总结了,可碍于最近一直在骑驴找马,白天工作,晚上面试,周末总结面试的知识点。今天终于放假了,才能够抽出时间来总结一下自己的2020。过去一年的经历受疫情影响,正月初十才回到北京,回到北京后又居家办公了大概一两个月,后面又变成了,单双号去单位办公,五一过后才基本上就恢复正常工作了。个人生活——结婚本来是一开始订的3月底的婚期,结果因为疫情的原因就延期了,疫情反反复复所以一直也没确定下来具体的时间。后面到七八月份的时候,总算是确定了几个日期。然后两家商量了一下,本来打算把日.

2021-02-05 18:34:18 380 7

原创 MySQL的索引为什么用B+Tree?InnoDB的数据存储文件和MyISAM的有何不同?

前言这篇文章的题目,是我真实在面试过程中遇到的问题,某互联网众筹公司在考察面试者MySQL相关知识的第一个问题,我当时还是比较懵的,没想到这年轻人不讲武德,不按套路出牌,一般的问MySQL的相关知识的时候,不都是问索引优化以及索引失效等相关问题吗?怎么还出来了,存储文件的不同?哪怕考察个MVCC机制也行啊。所以这次我就好好总结总结这部分知识点。为什么需要建立索引首先,我们都知道建立索引的目的是为了提高查询速度,那么为什么有了索引就能提高查询速度呢?我们来看一下,一个索引的示意图。如果我有一个SQ

2021-01-31 20:48:30 377 2

原创 你都用过SpringCloud的哪些组件,它们的原理是什么?

前言看到文章的题目了吗?就是这么抽象和笼统的一个问题,确实是我面试中真实被问到的,某共享货车平台的真实面试问题。springcloud确实是用过,但是那是三四年前了,那个时候springcloud刚兴起,我们技术总监让我们调研一下,然后算上我在内的三个同事就一人买了一本springcloud的书籍,开始看,开始研究,正好那个时候DDD也比较火,然后我们就一边研究的springcloud一边按照DDD的模型搭建自己的项目。但是这个项目最后做了三个月,才完成了一期。后面二期还没开始,我就撤了。所以sprin

2021-01-17 18:17:38 1067 11

原创 DFS(深度优先遍历)和BFS(广度优先遍历)Java模板代码

前言这次终于把深度优先-DFS和广度优先遍历-BFS弄明白了,用最基础的递归实现方式来记录一下。先贴一下,二叉树基础节点代码TreeNode,以及N叉树的基础节点代码TreeNode2。// 二叉树节点public class TreeNode { /* 当前节点值 */ int val; /* 左节点 */ TreeNode left; /* 右节点 */ TreeNode right; TreeNode(int val){

2021-01-05 08:35:15 1911

原创 Redis的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU。

前言这次的内容是我自己为了总结Redis知识而扩充的,上一篇其实已经总结了几点知识了,但是Redis的强大,以及适用范围之广可不是单单一篇博文就能总结清的。所以这次准备继续总结,因为第一个问题,Redis的批量操作,是我在面试过程中被真实问到的,当时没答上来,也是因为确实没了解过Redis的批量操作。当时的问题,我还记得比较清晰:Redis执行批量操作的功能是什么?使用场景就是搞促销活动时,会做预缓存,会往缓存里放大批数据,如果直接放的话那么会很慢,怎么能提高效率呢?Redis的批量操作-管道(pip

2021-01-04 08:31:49 504

原创 你说一下Redis为什么快吧,怎么实现高可用,还有持久化怎么做的。

前言作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩、击穿、穿透等。说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关的知识,但是Redis的功能太强大了,并不是一时半会儿能掌握好的,因为有些高级特性或是知识平时并不会用到。所以回答的不好,人家就会觉得你对自己平时使用的工具都没有了解,自然就凉凉了。其实很早就有这个打算,打算好好总结一下Redis的知识,但也是由于自己都没有好好的了解Redis呢,所以一直没有开始。这次准备慢

2020-12-28 23:54:46 233

原创 分布式事务了解吗?你们的多个服务间数据一致性解决方案是什么?

前言看标题就知道,这个又是个在面试中被问到的问题。这个问题其实是在我上次换工作的时候面试被问到过几次,之前也没在意过,觉得这个东西可能比较深奥,我直接说不理解吧。但是随着Java开发这个行业越来越卷,这次换工作一定要做好充足的准备。把之前落下的坑都填好,再出去受虐(面试)。什么是分布式事务我们都知道本地事务是有四个特性的:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。本地事务的ACID一般都是靠关系型数据库来完成的,非关

2020-12-20 17:56:58 1821 3

原创 你来讲一下springboot的启动时的一个自动装配过程吧

前言继续总结吧,没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看到springboot的启动的一个过程的源码的,但是时间隔得有点久了(两年多没用过springboot),所以当时也没答好。这次好好总结这部分知识。SpringApplication.run()我看网上好多介绍springboot自动装配过的文章时,上来就直接说@SpringBootApplication注解是一个

2020-12-14 00:12:48 307

原创 你说说对Java的SPI的理解吧

前言最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JNDI,以及JDK9的模块化都破坏了双亲委派。然后就被问,那你说说对Java中的SPI的理解吧。然后我就一脸懵逼了,之前只是知道它会破坏双亲委派,也知道是个怎么回事,但是并没有深入了解,那么这次我就好好的来总结一下这个知识吧。什么是SPISPI全称Service Provider Interface,字面意思

2020-12-07 00:33:57 242

原创 Redis的基础数据结构总结

前言面试被问到Redis相关知识,总是被虐的很惨。但是人就是这样,越挫越勇,就这块儿被虐的惨那我就要啃下这个硬骨头。从这次开始就要总结Redis的相关知识。Redis基础数据类型stringstring是一个可变的字节数组,内部结构类似于Java的ArrayList,采用预分配冗余空间的方式,来减少内存的频繁分配。当字符串小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次最多只扩容1M的空间。string最大空间为512M。当string类型的数据为一个整数时,还可以做计数器使用。例如

2020-12-01 23:40:25 247

原创 你说一下对Java中的volatile的理解吧,以及它是怎么保证可见性的。

前言volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性;禁止指令重排。这两个特性张口就来,但要再往深了问,具体是如何实现这两个特性的,以及在什么场景下使用volatile,为什么不直接用synchronized这种深入和扩展相关的问题,就回答的不好了。因为volatile是面试必问的知识,所以这次准备把这部分也给啃掉。系统处理效率与Java内存模型在计算机中,每条程序指令都是在CPU中执行的,而CPU执行指令的数据都是临时存储在内存中的,但是CPU的执行速度

2020-11-05 23:56:07 927 1

原创 你来讲讲AQS是什么吧?都是怎么用的?

前言在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问。我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它。当时自己确实没有讲好,所以这次来总结一下这个知识点。什么是AQSAQS全称是AbstractQueuedSynchronizer,形如其名,抽象队列同步器。AQS定义了两种资源共享模式:独占式,每次只能有一个线程持有锁,例如ReentrantLock实现的就是独占式的锁资源。共享式,允许多个线程同时获取锁,并发访问共享资源,

2020-09-30 08:05:46 1202 1

原创 来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?

前言看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。缓存穿透面试的时候就被问到了这个问题,具体描述就是,正常的请求都是先请求到缓存(就当我们的缓存是Redis吧),如果缓存中存在数据,就直接返回,如果缓存中不存在请求的数据,就查询数据库,然后将查询到的数据再放到缓存中。那么如果现在有一堆的请求,在缓存中没有,数据库中也没有,怎么办?这种垃圾请求还特别多,而且因为是在数据库没有

2020-09-16 08:35:32 131

原创 synchronized底层是怎么实现的?

前言面试的时候有被问到,synchronized底层是怎么实现的,回答的比较浅,面试官也不是太满意,所以觉得要好好总结一下,啃啃这个硬骨头。synchronized使用场景我们在使用synchronized的时候都知道它是可以使用在方法上的也可以使用在代码块上的,那么使用在这两个地方有什么区别呢?synchronized用在方法上使用在静态方法上,synchronized锁住的是类对象。public class SynchronizedTest { /** * synchro

2020-09-15 22:09:23 381

原创 来讲讲你对ThreadLocal的理解

前言面试的时候被问到ThreadLocal的相关知识,没有回答好(奶奶的,现在感觉问啥都能被问倒),所以我决定先解决这几次面试中都遇到的高频问题,把这几个硬骨头都能理解的透彻的说出来了,感觉最起码就不是一轮游了。ThreadLocal介绍ThreadLocal是JDK1.2开始就提供的一个用来存储线程本地变量的类。ThreadLocal中的变量是在每个线程中独立存在的,当多个线程访问ThreadLocal中的变量的时候,其实都是访问的自己当前线程的内存中的变量,从而保证的变量的线程安全。我们一般在使

2020-09-10 23:05:28 199 2

原创 ConcurrentHashMap的size方法是线程安全的吗?

前言之前在面试的过程中有被问到,ConcurrentHashMap的size方法是线程安全的吗?这个问题,确实没有答好。这次来根据源码来了解一下,具体是怎么一个实现过程。ConcurrentHashMap的原理与结构我们都知道Hash表的结构是数组加链表,就是一个数组中,每一个元素都是一个链表,有时候也把会形象的把数组中的每个元素称为一个“桶”。在插入元素的时候,首先通过对传入的键(key),进行一个哈希函数的处理,来确定元素应该存放于数组中哪个一个元素的链表中。这种数据结构在很多计算机语言中都能

2020-09-07 09:23:50 2168 2

原创 Spring是怎么解决Bean之间的循环依赖?

前言在面试的时候这两年有一个非常高频的关于spring的问题,那就是spring是如何解决循环依赖的。这个问听着就是轻描淡写的一句话,其实考察的内容还是非常多的,主要还是考察的应聘者有没有研究过spring的源码。但是说实话,spring的源码其实非常复杂的,研究起来并不是个简单的事情,所以我们此篇文章只是为了解释清楚Spring是如何解决循环依赖的这个问题。什么样的依赖算是循环依赖?用过Spring框架的人都对依赖注入这个词不陌生,一个Java类A中存在一个属性是类B的一个对象,那么我们就说类A的对

2020-08-25 23:47:22 710 1

原创 MySQL是如何实现ACID的

前言最近在面试,有被问到,MySQL的InnoDB引擎是如何实现事务的,又或者说是如何实现ACID这几个特性的,当时没有答好,所以自己总结出来,记录一下。事务的四大特性ACID事务的四大特性ACID分别是,A-原子性(Atomicity),C-一致性(Consistency),I-隔离性(Isolation),D-持久性(Durability)。一致性是最终目的,原子性、隔离性、持久性是为了保证一致性所做的措施。所以我写的顺序并不是按照ACID来写的,将一致性放到了最后,顺序就变成了,ADIC。原子

2020-08-19 11:26:59 825 1

原创 深入理解JVM(③)Java的锁优化

前言

2020-07-25 16:46:03 141

原创 深入理解JVM(③)再谈线程安全

前言我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的。因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然后在此基础上来实现高效。所以线程安全是高并发程序首先需要保证的。线程安全定义对于线程安全的定义可以理解为:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程

2020-07-15 23:21:35 210

原创 深入理解JVM(③)线程与Java的线程

前言我们都知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源调度(内存地址、文件I/O等),又可以独立调度。线程的实现主流的操作系统都提供了线程实现,Jav语言则是提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经调用过start()方法且还未结束的java.lang.Thread类的实例就代表这一个线程。其实Thread类与大部分的Java类库API有着显著差别,它的所有关键方法都被声明为Native。在Java中,

2020-07-11 12:05:50 319

原创 深入理解JVM(③)学习Java的内存模型

前言Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题。定义Java内存模型并非一件容易的事情,从Java出生开始经过长时间的验证和修补,直至JDK5发布后Java内存模型才终于成熟、完善起来了。主内存与工作内存Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。Java内存模型规定了所有变量都存储在主内存(Main

2020-07-09 08:12:19 303

原创 深入理解JVM(③)Java模块化系统

前言JDK9引入的Java模块化系统(Java Platform Module System ,JPMS)是 对Java技术的一次重要升级,除了像之前JAR包哪有充当代码的容器之外,还包括:依赖其他模块的列表。导出的包列表,即其他模块可以使用的列表。开放的包列表,即其他模块可反射访问模块的列表。使用的服务列表。提供服务的实现列表。模块化系统可配置的封装隔离机制解决了原来类路径上跨文件的public类的可访问性的问题。public类型不再意味着所有地方代码都可以访问它们,未导出和未开放的类

2020-06-30 23:29:09 462

原创 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

前言先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为“类加载器(Class Loader)”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。每个类加载器都有一个独立的类名称空间,所以每个类唯一性都必须是建立在是否为同一个类加载器的前提下的。否则,即使是两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。例如:public c

2020-06-28 19:00:23 209

原创 深入理解JVM(③)虚拟机的类加载过程

前言上一篇我们介绍到一个类的生命周期大概分7个阶段:加载、验证、准备、解析、初始化、使用、卸载。并且也介绍了类的加载时机,下面我们将介绍一下虚拟机中类的加载的全过程。主要是类生命周期的,加载、验证、准备、解析和初始化这五个阶段所执行的具体动作。加载类加载过程的第一个阶段就是加载,在加载阶段,Java虚拟机需要完成以下三件事情:1. 通过一个类的全限定名来获取定义此类的二进制字节流。2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3. 在内存中生成一个代表这个类的java.la

2020-06-27 15:12:52 138

原创 深入理解JVM(③)类是在什么时候进行加载的?

前言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载除内存为止,它的生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和 卸载(Unloading)、七个阶段,其中验证、准备、解析三个部

2020-06-24 18:08:04 1058 1

原创 深入理解JVM(③)虚拟机性能监控、故障处理工具

前言JDK的bin目录中有一系列的小工具,除了java.exe、javac.exe这两个编译和运行Java程序外,还有打包、部署、签名、调试、监控、运维等各种场景都会用到这些小工具。

2020-06-22 23:00:57 205

原创 深入理解JVM(③)ZGC收集器

前言ZGC是一款在JDK11中新加入的具有实验性质的低延迟垃圾收集器,目前仅支持Linux/x86-64。ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。ZGC布局与Shenandoah和G1一样,ZGC也采取基于Region的堆内存布局,但与他们不同的是,ZGC的Region具有动态性(动态的创建和销毁,以及动态的区域容量大小)。ZGC的Region可以分为三类:小型

2020-06-20 20:28:55 601

原创 深入理解JVM(③)低延迟的Shenandoah收集器

Shenandoah作为第一款不由Oracle(包括一起的Sun)公司的虚拟机团队所领导开发的HotSpot垃圾收集器。是只存在于OpenJDK当中的,最初由RedHat公司创建的,在2014年的时候贡献给了OpenJDK。与G1相比的优点从代码的历史渊源上来看,Shenandoah收集器更像是G1的下一代继承者,两者相似的堆内存布局,在初始标记、并发标记等许多阶段的处理思路都高度一致。但是Shenandoah相比G1还是至少有三个明显的不同之处。1、支持并发的整理算法,G1的回收阶段是可以多线程并

2020-06-17 22:14:27 957 4

原创 深入理解JVM(③)经典的垃圾收集器

前言如果说垃圾收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。本次要介绍的是几款“经典”的垃圾收集器,之所以被称之为“经典”,是为了与几款目前仍处于实验状态,但是执行效果上哟革命性改进的高性能低延迟收集器区分开来,虽然算不上最先进的技术,但却是在实践中千锤百炼,足够成熟,可以在商用生产环境上放心使用的全部垃圾收集器。这些“经典”收集器之间的关系图这七种作用于不同分代的收集器,如果两个之间存在连续,说明可以搭配使用。目前这些垃圾收集器并不都是“万能”的,所以针对于各个垃圾收集器,我们的目

2020-06-14 19:47:36 244

原创 深入理解JVM(③)各种垃圾收集算法

前言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。由于束流Java虚拟机中使用 的都是“追踪式垃圾收集”,所以后续介绍的垃圾收集算法都是属于追踪式的垃圾收集。分代式收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计。主要简历在两个分代假说之上:1、弱分代假说:绝大多数对象都是“朝生夕灭”的。2、

2020-06-11 22:50:04 119

空空如也

空空如也

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

TA关注的人

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