- 博客(32)
- 收藏
- 关注
原创 JAVA工程师面试专题-《Redis》篇
一、基础1、Redis 是什么2、说一下你对redis的理解3、Redis 为什么这么快?4、项目中如何使用缓存?5、为什么使用缓存?6、Redis key 和value 可以存储最大值分别多是多少?7、Redis和memcache有什么区别?8、说说redis常用应用场景二、数据类型1、redis有哪些数据类型,分别适用于什么场景?2、说说Redis底层数据结构?三、架构1、redis 持久化机制2、redis集群高可用(1)Replicatio
2024-02-25 19:43:39
1212
原创 聊聊mysql的七种日志
redolog、undolog、binlog、relaylog、slow query log、general query log、error log
2024-02-23 16:07:36
787
原创 JAVA工程师面试专题-《Mysql》篇
一、基础1、mysql可以使用多少列创建索引?2、mysql常用的存储引擎有哪些3、MySQL 存储引擎,两者区别4、mysql默认的隔离级别5、数据库三范式6、drop、delete 与 truncate 区别?7、IN与EXISTS的区别二、索引1、索引及索引底层数据结构2、二叉树、B树和B+树有什么区别?3、关于索引的底层实现,为什么选择 B+Tree 而不是红黑树?4、索引算法有哪些5、InnoDB一棵B+树的查找流程
2024-02-23 14:52:18
2434
原创 一文穿透线程池,从此吊打面试官
Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executor框架可以非常方便的创建一个线程池。
2024-02-22 17:30:53
1114
原创 JAVA工程师面试专题-《并发编程篇》
wait() 是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁。每个对象(Object)都拥有对象锁,既然要释放当前线程占有的对象锁并让其进入 WAITING 状态,自然是要操作对应的对象(Object)而非当前的线程(Thread)。类似的问题:为什么 sleep() 方法定义在 Thread 中?因为 sleep() 是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。15、
2024-02-22 16:50:01
966
1
原创 JAVA工程师面试专题-《JVM篇》
一个对象的 GC 年龄,是存储在对象头里面的(如图),一个 Java 对象在 JVM内存中的布局由三个部分组成,分别是对象头、实例数据、对齐填充。而对象头里面有 4 个 bit 位来存储 GC 年龄。而 4 个 bit 位能够存储的最大数值是 15,所以从这个角度来说,JVM 分代年龄之所以设置成 15 次是因为它最大能够存储的数值就是 15。虽然 JVM 提供了参数来设置分代年龄的大小,但是这个大小不能超过 15。
2024-02-20 23:34:18
1323
原创 Tomcat是如何打破“双亲委派“机制的
Tomcat打破双亲委派机制的目的其实很简单,我们知道web容器可能是需要部署多个应用程序的,这在早期的部署架构中也经常见到,如上图。但是假设不同的应用程序可能会同时依赖第三方类库的不同版本。我们通过上文在了解类加载机制的时候知道它是要确保唯一性的,但是总不能要求同一个类库在web容器中只有一份吧?所以Tomcat就需要保证每个应用程序的类库都是相互隔离并独立的,这也是它打破双亲委派机制的主要目的。
2024-02-20 17:37:07
960
原创 说一下JVM类加载机制?
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存销。
2024-02-20 17:07:37
650
原创 说一下JVM创建对象的流程?
当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对象,并在分配后更新列表记录。JVM 还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的 GC 分代年龄、hashcode、锁标记等等。
2024-02-20 16:40:11
646
原创 说一下 JVM 有哪些垃圾回收器?
下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
2024-02-20 16:06:04
556
原创 说一下 JVM 有哪些垃圾回收算法?
标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
2024-02-20 15:59:32
841
原创 说一下 JVM 运行时数据区 ?
当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成(为什么要线程计数器?与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;(Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
2024-02-20 15:24:15
595
原创 说一下JVM的主要组成部分及其作用?
字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行。首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内。同时,java代码中,可以调用其他语言的本地库接口(Native Interface)来,进行一些系统调用或者c函数调用。
2024-02-20 15:15:03
492
原创 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
602
原创 Redis缓存和MySQL数据一致性方案详解
需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能
2022-02-22 09:29:31
232
原创 进程间通信方式
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。1、匿名管道通信匿名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。// 需要的头文件#include <unistd.h>// 通.
2022-02-21 15:43:42
133
原创 TCP是如何保证可靠传输的
一、综述1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。2、数据校验3、数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报. tcp会按MTU合理分片,接收方会缓存
2022-02-21 15:18:32
803
原创 TCP三次握手四次挥手
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。确认ACK:占1位,仅当ACK=1时,确...
2022-02-21 15:12:48
80
原创 通俗易懂,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
111
原创 聚簇索引与非聚簇索引(也叫二级索引)
通俗点讲聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引
2022-02-21 12:53:01
705
原创 Mysql索引原理及慢查询优化
背景MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。本人从2013年7月份起,一直在美团
2022-02-21 12:39:14
186
原创 Redis 缓存穿透 + 缓存雪崩 + 缓存击穿的原因和解决方案
在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作用降低一、缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。在日常工作中出于容错的考虑,如果从持久层查不到数据则不写入缓存层,缓存穿透将导致不存在的数据每次请求都要到持久层去查询,失去了缓存保护后端持久的意义缓存穿透示意图: 缓存穿透问题可能会使后端存储负载加大,由于很多后端持久层不具备高并发性,...
2022-02-21 10:34:26
122
原创 Spring 如何解决循环依赖
1. 前言循环依赖:就是N个类循环(嵌套)引用。通俗的讲就是N个Bean互相引用对方,最终形成闭环。用一副经典的图示可以表示成这样(A、B、C都代表对象,虚线代表引用关系):其实可以N=1,也就是极限情况的循环依赖:自己依赖自己 这里指的循环引用不是方法之间的循环调用,而是对象的相互依赖关系。(方法之间循环调用若有出口也是能够正常work的)2. Spring Bean的循环依赖谈到Spring Bean的循环依赖,有的小伙伴可能比较陌生,毕竟开发过程中好像对循环依赖这个概念
2022-02-19 23:40:12
1216
原创 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
81
原创 Spring Bean 的作用域
在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean的定义以及bean相互间的依赖关系将通过配置元数据来描述。Spring中的bean默认都是单例的,对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框架之后,每个Action都是单例的,那么对于Spring托管的单例Se.
2022-02-17 16:03:24
733
原创 Spring Bean的生命周期
Spring Bean的生命周期是Spring面试热点问题。这个问题既考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文从源码角度入手,希望能够帮助面试者彻底搞定Spring Bean的生命周期。一、结论:只有四个!是的,Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注
2022-02-16 16:10:35
70
原创 Windows 环境部署 Nacos
1、下载下载地址:https://github.com/alibaba/nacos/releases/tag/1.1.0选择这个zip下载。下载完毕后我们可以看看目录结构:这里的bin目录里面有windows启动文件startup.cmd,我们双击就能启动了,和大多数windows进程类似。启动后会有一个cmd窗口去打印命令并启动。这里我们启动成功了,启动失败后窗口会一闪而过。2、访问访问地址:http://localhost:8848/n...
2021-10-09 10:57:59
124
原创 ORM框架Hibernate与Mybatis对比,各自优劣之处
(一)简单介绍Hibernate和 MybatisHibernate:Hibernate是当前最流行的ORM框架之一,对JDBC提供了较为完整的封装。Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO与SQL之间的映射关系。然后通过映射
2017-06-21 17:14:09
703
1
原创 浏览器分别在哪些情况下使用get方式和post方式访问web服务器
get请求方式:直接在浏览器地址栏输入地址的访问方式,或提交表单时,该表单对应的form元素没有设置method方式或者method方式为get时。get方式的请求会将请求参数的名和值转换为字符串,并附加在原url之后,因此可以在地址栏看到请求参数名和值。且get请求方式传送的数据量小,一般不能大于2KB。Post请求方式:通过表单提交,且需要设置form的元素为post。po
2017-02-07 15:48:25
6763
春节灯笼js效果,可以嵌入网站头部,烘托节日气氛
2024-02-21
最新java面试专题01-JVM
2024-02-20
50万字大厂后端面经,java生态全链路面试真题总结
2024-02-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人