每天一股,Java八股
文章平均质量分 83
每天一道Java八股,面试官弟弟直呼内行
码农滴自我修养
那个有风的下午,你叫我换一个角落,看看飞翔可以多么广阔。不快乐,不过是生活的匆匆过客!
展开
-
聊聊mysql的七种日志
redolog、undolog、binlog、relaylog、slow query log、general query log、error log原创 2024-02-23 16:07:36 · 819 阅读 · 0 评论 -
一文穿透线程池,从此吊打面试官
Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executor框架可以非常方便的创建一个线程池。原创 2024-02-22 17:30:53 · 1153 阅读 · 0 评论 -
聚簇索引与非聚簇索引(也叫二级索引)
通俗点讲聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引原创 2022-02-21 12:53:01 · 750 阅读 · 0 评论 -
说一下 JVM 运行时数据区 ?
当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成(为什么要线程计数器?与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;(Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。原创 2024-02-20 15:24:15 · 617 阅读 · 0 评论 -
说一下 JVM 有哪些垃圾回收算法?
标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。原创 2024-02-20 15:59:32 · 890 阅读 · 0 评论 -
Spring 如何解决循环依赖
1. 前言循环依赖:就是N个类循环(嵌套)引用。通俗的讲就是N个Bean互相引用对方,最终形成闭环。用一副经典的图示可以表示成这样(A、B、C都代表对象,虚线代表引用关系):其实可以N=1,也就是极限情况的循环依赖:自己依赖自己 这里指的循环引用不是方法之间的循环调用,而是对象的相互依赖关系。(方法之间循环调用若有出口也是能够正常work的)2. Spring Bean的循环依赖谈到Spring Bean的循环依赖,有的小伙伴可能比较陌生,毕竟开发过程中好像对循环依赖这个概念原创 2022-02-19 23:40:12 · 1255 阅读 · 0 评论 -
Mysql索引原理及慢查询优化
背景MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。本人从2013年7月份起,一直在美团原创 2022-02-21 12:39:14 · 213 阅读 · 0 评论 -
TCP是如何保证可靠传输的
一、综述1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。2、数据校验3、数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报. tcp会按MTU合理分片,接收方会缓存原创 2022-02-21 15:18:32 · 837 阅读 · 0 评论 -
说一下 JVM 有哪些垃圾回收器?
下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。原创 2024-02-20 16:06:04 · 577 阅读 · 0 评论 -
Redis 缓存穿透 + 缓存雪崩 + 缓存击穿的原因和解决方案
在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作用降低一、缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。在日常工作中出于容错的考虑,如果从持久层查不到数据则不写入缓存层,缓存穿透将导致不存在的数据每次请求都要到持久层去查询,失去了缓存保护后端持久的意义缓存穿透示意图: 缓存穿透问题可能会使后端存储负载加大,由于很多后端持久层不具备高并发性,...原创 2022-02-21 10:34:26 · 136 阅读 · 0 评论 -
TCP三次握手四次挥手
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。确认ACK:占1位,仅当ACK=1时,确...原创 2022-02-21 15:12:48 · 97 阅读 · 0 评论 -
进程间通信方式
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。1、匿名管道通信匿名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。// 需要的头文件#include <unistd.h>// 通.原创 2022-02-21 15:43:42 · 156 阅读 · 0 评论 -
Windows 安装RocketMQ
目录一、安装windows版本RocketMQ1.1 首先去官网下载zip包1.2 、下载后,解压到指定目录1.3、配置RocketMQ环境变量1.4、启动mqnameserver1.5、再启动mqbroker二、使用RocketMQ管理后台。2.1、去github上下载项目2.2、设置项目的配置文件2.3、启动应用。原创 2024-01-09 14:40:33 · 657 阅读 · 0 评论 -
Redis缓存和MySQL数据一致性方案详解
需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能原创 2022-02-22 09:29:31 · 267 阅读 · 0 评论 -
通俗易懂,MySQL事务隔离级别和MVCC
为了故事的顺利发展,我们需要创建一个表:CREATE TABLE t ( id INT PRIMARY KEY, c VARCHAR(100)) Engine=InnoDB CHARSET=utf8;然后向这个表里插入一条数据:INSERT INTO t VALUES(1, '刘备');现在表里的数据就是这样的:mysql> SELECT * FROM t;+----+--------+| id | c |+----+--------+|原创 2022-02-21 14:09:05 · 125 阅读 · 0 评论 -
Tomcat是如何打破“双亲委派“机制的
Tomcat打破双亲委派机制的目的其实很简单,我们知道web容器可能是需要部署多个应用程序的,这在早期的部署架构中也经常见到,如上图。但是假设不同的应用程序可能会同时依赖第三方类库的不同版本。我们通过上文在了解类加载机制的时候知道它是要确保唯一性的,但是总不能要求同一个类库在web容器中只有一份吧?所以Tomcat就需要保证每个应用程序的类库都是相互隔离并独立的,这也是它打破双亲委派机制的主要目的。原创 2024-02-20 17:37:07 · 1030 阅读 · 0 评论 -
说一下JVM创建对象的流程?
当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对象,并在分配后更新列表记录。JVM 还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的 GC 分代年龄、hashcode、锁标记等等。原创 2024-02-20 16:40:11 · 698 阅读 · 0 评论 -
说一下JVM类加载机制?
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存销。原创 2024-02-20 17:07:37 · 681 阅读 · 0 评论 -
Mysql执行计划
MySQL 使用explain + sql 语句查看 执行计划,该执行计划不一定完全正确但是可以参考。EXPLAIN SELECT * FROM user WHERE nid = 3;select_type 说明 SIMPLE 简单查询 PRIMARY 最外层查询 SUBQUERY 映射为子查询 DERIVED 子查询 UNION 联合 UNION RESULT 使用联合的结果 table: 正在访问的表名type..原创 2022-02-18 20:28:44 · 98 阅读 · 0 评论 -
说一下JVM的主要组成部分及其作用?
字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行。首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内。同时,java代码中,可以调用其他语言的本地库接口(Native Interface)来,进行一些系统调用或者c函数调用。原创 2024-02-20 15:15:03 · 514 阅读 · 0 评论