自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 offer来了(长期更新)

目录 java基础 集合 异常 反射 注解 内部类 泛型 序列化 网络编程 JVM JVM GC 并发编程

2020-12-27 23:33:45 638

原创 java面试宝典

1.Java1.java基础2.集合3.多线程4.JVM5.JUC6.新特性2.网络3.数据结构4.并发编程5.数据库1.Mysql2.Redis6.框架1.Spring2.SpringMVC3.MyBatis4.Springboot5.SpringCloud6.Netty7.Dubbo8.Zookeeper9.Nginx10.Docker11.Linux7.分布式1.分布式缓存2.分布式事务3.

2020-12-24 21:32:38 102 2

原创 网络

网络1.网络在计算机领域中,网络是信息传输、接收、共享的虚拟平台,将各个点、面、体的信息联系到一起,从而实现这些资源的共享。在大型分布式系统中,网络起着至关重要的作用,本章对常用的网络7层架构,以及TCP/IP、HTTP和CDN的原理做简单介绍,这是我们构建分布式系统所必须了解的,只有理解这些原理,才能设计出好的系统,并更有针对性地做系统架构调优。2.OSI七层网络模型网络的七层架构从下到上主要包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 物理层主要定义物理设备标准

2020-12-30 23:47:41 430

原创 MySQL

MySQL1.存储引擎数据库的存储引擎是数据库的底层软件组织,数据库管理系统(DBMS)使用存储引擎创建、查询、更新和删除数据。不同的存储引擎提供了不同的存储机制、索引技巧、锁定水平等功能,都有其特定的功能。现在,许多数据库管理系统都支持多种存储引擎,常用的存储引擎主要有MyISAM、InnoDB、Memory、Archive和Federated。2.MyIASMMyIASM是MySQL默认的存储引擎,不支持数据库事务、行级锁和外键,因此在INSERT(插入)或UPDATE(更新)数据即写操

2020-12-30 23:40:18 174

原创 Ehcache

EhcacheEhcache是基于Java实现的一套简单、高效、线程安全的缓存管理类库。Ehcache提供了内存、磁盘文件及分布式存储方式等多种灵活的Cache管理方案,特点是快速、轻量、可伸缩、操作灵活、支持持久化等。1.Ehcache的原理Ehcache是基于Java实现的高效缓存框架,其内部采用多线程实现,采用LinkedHashMap存储元素,同时支持将数据持久化到物理磁盘上。2.Ehcache的特点(1)快速:Ehcache内部采用多线程机制实现,数据存取性能高。(2)轻量

2020-12-30 23:37:49 1373

原创 offer来了-数据结构

1.常用数据结构数据结构指数据的存储、组织方式。栈顶部元素插入和取出快。除顶部元素外,存储其他元素都很慢。队列顶部元素插入和尾部元素取出快。存储其他元素很慢。链表插入和删除都快。查找慢。二叉树插入、删除、查找都快。删除算法复杂红黑树插入、删除、查找都快。算法复杂散列表插入、删除、查找都快。数据散列,对存储空间有浪费位图节省存储空间不方便描述复杂的数据关系2.栈栈(Stack)又名堆栈,是允许在同一端进行插入和删除

2020-12-30 23:34:35 204 2

转载 offer来了-阻塞队列

1.Java阻塞队列队列是一种只允许在表的前端进行删除操作,而在表的后端进行插入操作的线性表。阻塞队列和一般队列的不同之处在于阻塞队列是“阻塞”的,这里的阻塞指的是操作队列的线程的一种状态。在阻塞队列中,线程阻塞有如下两种情况。消费者阻塞:在队列为空时,消费者端的线程都会被自动阻塞(挂起),直到有数据放入队列,消费者线程会被自动唤醒并消费数据 生产者阻塞:在队列已满且没有可用空间时,生产者端的线程都会被自动阻塞(挂起),直到队列中有空的位置腾出,线程会被自动唤醒并生产数据。2.阻塞队列的主要操作

2020-12-29 03:04:19 672

转载 offer来了-并发

1.CountDownLatchCountDownLatch类位于java.util.concurrent包下,是一个同步工具类,允许一个或多个线程一直等待其他线程的操作执行完后再执行相关操作。CountDownLatch基于线程计数器来实现并发访问控制,主要用于主线程等待其他子线程都执行完毕后执行相关操作。其使用过程为:在主线程中定义CountDownLatch,并将线程计数器的初始值设置为子线程的个数,多个子线程并发执行,每个子线程在执行完毕后都会调用countDown函数将计数器的值减1,直到

2020-12-29 03:03:09 116

转载 offer来了-锁

1.Java中的锁Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁进行操作。这样就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据的安全。锁从乐观和悲观的角度可分为乐观锁和悲观锁,从获取资源的公平性角度可分为公平锁和非

2020-12-29 03:01:52 181

转载 多线程

多线程多线程能够在操作系统多核配置的基础上,能够更好地利用服务器的多个CPU资源,使程序运行起来更加高效。Java通过提供对多线程的支持来在一个进程内并发执行多个线程,每个线程都并行执行不同的任务,以满足编写高效率程序的要求。1.Java线程的创建方式继承Thread类 实现Runnable接口 通过ExecutorService和Callable实现有返回值的线程 基于线程池2.继承Thread类Thread类实现了Runnable接口并定义了操作线程的一些方法,我们可以通过继承T

2020-12-29 02:59:50 278

转载 offer来了-GC

1.如何确定垃圾Java采用引用计数法和可达性分析来确定对象是否应该被回收。其中,引用计数法容易产生循环引用的问题,可达性分析通过根搜索算法(GCRoots Tracing)来实现。根搜索算法以一系列GC Roots的点作为起点向下搜索,在一个对象到任何GC Roots都没有引用链相连时,说明其已经死亡。根搜索算法主要针对栈中的引用、方法区中的静态引用和JNI中的引用展开分析。2.引用计数法在Java中如果要操作对象,就必须先获取该对象的引用,因此可以通过引用计数法来判断一个对象是否可以

2020-12-27 23:24:31 120

转载 offer来了-JVM

1.JVM的运行机制JVM(Java Virtual Machine)是用于运行Java字节码的虚拟机,包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互。Java源文件在通过编译器之后被编译成相应的.Class文件(字节码文件),.Class文件又被JVM中的解释器编译成机器码在不同的操作系统(Windows、Linux、Mac)上运行。每种操作系统的解释器都是不同的,但基于解释器实现的虚拟机是相同的,这也是

2020-12-27 23:23:27 132

转载 offer来了-网络编程

1.阻塞I/O模型阻塞I/O模型是常见的I/O模型,在读写数据时客户端会发生阻塞。阻塞I/O模型的工作流程为:在用户线程发出I/O请求之后,内核会检查数据是否就绪,此时用户线程一直阻塞等待内存数据就绪;在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。典型的阻塞I/O模型的例子为data = socket.read(),如果内核数据没有就绪,Socket线程就会一直阻塞在read()中等待内核数据就绪。2.非阻塞I/O模型

2020-12-27 23:20:56 123

转载 offer来了-泛型

1.泛型是什么泛型的本质是参数化类型,泛型提供了编译时类型的安全检测机制,该机制允许程序在编译时检测非法的类型,比如要实现一个能够对字符串(String)、整形(Int)、浮点型(Float)、对象(Object)进行大小比较的方法,就可以使用Java泛型。在不使用泛型的情况下,我们可以通过引用Object类型来实现参数的任意化,因为在Java中Object类是所有类的父类,但在具体使用时需要进行强制类型转换。强制类型转换要求开发者必须明确知道实际参数的引用类型,不然可能引起前置类型转换错误,在编译期无

2020-12-27 23:18:30 146

转载 offer来了-内部类

定义在类内部的类被称为内部类。内部类根据不同的定义方式,可分为静态内部类、成员内部类、局部内部类和匿名内部类这4种。1.静态内部类定义在类内部的静态类被称为静态内部类。静态内部类可以访问外部类的静态变量和方法;在静态内部类中可以定义静态变量、方法、构造函数等;静态内部类通过“外部类.静态内部类”的方式来调用。public class OutClass{ public static class StaticInnerClass{ }}上面的代码通过public static cl

2020-12-27 23:17:18 92

转载 offer来了-注解

1.注解的概念注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口,程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。2.标准元注解元注解(Meta-Annotation)负责注解其他注解。在Java中定义了 4个标准的元注解类型@Target、@Retention、@Documented、@Inherited,用于定义不同类型的注解。(1)@Target:@Target说明了注解所修饰的对

2020-12-27 23:16:00 156

转载 offer来了-反射

1.反射机制的概念反射机制指在程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能被称为Java语言的反射机制。2.反射的应用Java中的对象有两种类型:编译时类型和运行时类型。编译时类型指在声明对象时所采用的类型,运行时类型指为对象赋值时所采用的类型。在如下代码中,persion对象的编译时类型为Person,运行时类型为Student,因此无法在编译时获取在Student类中定义的方法:

2020-12-27 23:14:54 89

转载 offer来了-异常

1.异常的概念异常指在方法不能按照正常方式完成时,可以通过抛出异常的方式退出该方法,在异常中封装了方法执行过程中的错误信息及原因,调用方在获取该异常后可根据业务的情况选择处理该异常或者继续抛出该异常。在方法在执行过程中出现异常时,Java异常处理机制会将代码的执行权交给异常处理器,异常处理器根据在系统中定义的异常处理规则执行不同的异常处理逻辑(抛出异常或捕捉并处理异常)。2.异常分类在Java中,Throwable是所有错误或异常的父类,Throwable又可分为Error和Exceptio

2020-12-27 23:13:42 133

转载 offer来了-集合

1.集合Java的集合类被定义在Java.util包中,主要有4种集合,分别为List、Queue、Set和Map。List ArrayList LinkedList Vector Queue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue DelayQueue SynchronousQueue LinkedTransferQueue LinkedBlockingDeque Se

2020-12-27 23:12:18 151

原创 Zookeeper

Zookeeper1.zookeeper 的使用场景分布式协调这个其实是 zookeeper 很经典的一个用法,简单来说,就好比,你 A 系统发送个请求到 mq,然后 B 系统消息消费之后处理了。那 A 系统如何知道 B 系统的处理结果?用 zookeeper 就可以实现分布式系统之间的协调工作。A 系统发送请求之后可以在 zookeeper 上对某个节点的值注册个监听器,一旦 B 系统处理完了就修改 zookeeper 那个节点的值,A 系统立马就可以收到通知,完美解决。分布式锁举个栗

2020-12-26 01:02:31 167

原创 Elasticsearch

Elasticsearch1.es 的核心概念Near Realtime近实时,有两层意思: 从写入数据到数据可以被搜索到有一个小延迟(大概是 1s) 基于 es 执行搜索和分析可以达到秒级 Cluster 集群集群包含多个节点,每个节点属于哪个集群都是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。Node 节点Node 是集群中的一个节点,节点也有一个名称,默认是随机分配的。默认节点会去加入一个名称为 elasticsearch 的集

2020-12-26 00:52:49 191

原创 Dubbo

Dubbo1.dubbo 工作原理 第一层:service 层,接口层,给服务提供者和消费者来实现的 第二层:config 层,配置层,主要是对 dubbo 进行各种配置的 第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信 第四层:registry 层,服务注册层,负责服务的注册与发现 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组

2020-12-26 00:52:08 164

原创 Spring

Spring1.说说你对Spring的AOP机制的理解可以吗?面向切面,通过动态代理的方式来生成其代理对象在方法执行前后加入自己的逻辑。代理方式:jdk动态代理(接口) cglib动态代理(基于类)相关名词:1.JoinPoint连接点:拦截的接口的方法 。2.Pointcut切入点:对哪些连接点进行拦截 。3.Advice通知:比如前置通知 后置通知 环绕通知 。4.aspect切面:切入点和通知组成。切入点 execution表达式。execution 权限修饰符

2020-12-26 00:43:42 72

原创 海量数据处理

海量数据处理1.如何从大量的 URL 中找出相同的 URL?题目描述给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。解答思路每个 URL 占 64B,那么 50 亿个 URL 占用的空间大小约为 320GB。5, 000, 000, 000 _ 64B ≈ 5GB _ 64 = 320GB由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题目,

2020-12-26 00:22:39 182

原创 并发编程

并发编程1.synchronized关键字的底层原理是什么?其实synchronized底层的原理,是跟jvm指令和monitor有关系的你如果用到了synchronized关键字,在底层编译后的jvm指令中,会有monitorenter和monitorexit两个指令 。每个对象都有一个关联的monitor,比如一个对象实例就有一个monitor,一个类的Class对象也有一个monitor,如果要对这个对象加锁,那么必须获取这个对象关联的monitor的lock锁。他里面的原理和思路

2020-12-26 00:20:04 82

原创 生产实践

生产实践1.线上服务器CPU 100%了!该怎么排查、定位和解决?(1)定位耗费cpu的进程top -c,就可以显示进程列表,然后输入P,按照cpu使用率排序,你会看到类似下面的东西PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND43987 root 20 0 28.2g 4.5g 68m S 99.0 24.0 44333.4 java -Xms。。。大概类似上面这样,能看到哪个进程,CPU负载最高,还有启动这个进程的命令,

2020-12-26 00:18:22 111

原创 网络

网络1.OSI七层网络模型一个标准的网络模型出来,大家都按照这个来走,大家都要遵守统一的规范。这就是所谓OSI七层模型,他们分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。那么在这个基础上,又简化出了TCP/IP四层模型,数据链路层、网络层、传输层、应用层。1、物理层:物理设备,传输0/1电路信号。2、数据链路层:解析/组包电路信号,走以太网协议,封装对应带有mac地址的数据包。3、网络层:通过IP再次对底层网络进行抽象,将网络划分为局域网,广域网等等。4、传输层

2020-12-26 00:17:09 303

原创 系统安全

系统安全1.一般黑客常用的XSS网络攻击的原理是什么?XSS的全称是Cross Site Script,就是跨站点脚本攻击,意思就是说,黑客恶意篡改你的网页的前端代码,在里面注入一些他自己的html+javascript的脚本和代码,然后你比如在访问那个网站的网页的时候,他注入的那些恶意脚本就会运行了。恶意脚本运行的时候就会控制你的浏览器,这个时候他的脚本就可以做很多很多的事情了。第一种XSS攻击是反射型攻击,他主要是想办法让你点击一个URL链接,在这个URL链接里就嵌入他自己的恶意脚本,你

2020-12-26 00:16:11 610

原创 JVM

JVM1.Java代码到底是如何运行起来的?1)编译:“.java”代码打包的过程中,一般就会把代码编译成“.class”后缀的字节码文件。2)采用“java”命令,实际上此时就会启动一个JVM进程。这个JVM就会来负责运行这些“.class”字节码文件,也就相当于是负责运行我们写好的系统。3)JVM用类加载器把编译好的那些“.class”字节码文件给加载到JVM中,然后供后续代码运行来使用。4)JVM就会基于自己的字节码执行引擎,来执行加载到内存里的我们写好的那些类了。2.类从加载

2020-12-26 00:14:45 147

原创 Mysql

Mysql1.如何实现 MySQL 的读写分离?基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。2.MySQL 主从复制原理的是啥?主库将变更写入 binlog 日志,然后从库连接到主库之后,从库有一个 IO 线程,将主库的 binlog 日志拷贝到自己本地,写入一个 relay 中继日志中。接着从库中有一个 SQL 线程会从中继日志读取 binlog,然后执行 binlog 日志中的内容,也就是在自己本地再次执行一遍 S

2020-12-24 23:38:03 83

原创 分库分表

分库分表1.为什么要分库分表分表比如你单表都几千万数据了,你确定你能扛住么?绝对不行,单表数据量太大,会极大影响你的 sql执行的性能,到了后面你的 sql 可能就跑的很慢了。一般来说,就以我的经验来看,单表到几百万的时候,性能就会相对差一些了,你就得分表了。分表是啥意思?就是把一个表的数据放到多个表中,然后查询的时候你就查一个表。比如按照用户 id 来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了。这样可以控制每个表的数据量在可控的范围内,比如每个表就.

2020-12-24 22:38:50 164

转载 消息队列

消息队列1.为什么使用消息队列?你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。比较核心的有 3 个:解耦、异步、削峰。解耦总结:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。面试技巧:你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接

2020-12-24 21:36:37 298 2

转载 Kafka

Kafka1.Kafka 的高可用性Kafka 一个最基本的架构认识:由多个 broker 组成,每个 broker 是一个节点;你创建一个 topic,这个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据。这就是天然的分布式消息队列,就是说一个 topic 的数据,是分散放在多个机器上的,每个机器就放一部分数据。实际上 RabbitMQ 之类的,并不是分布式消息队列,它就是传统的消息队列

2020-12-24 21:36:13 95 1

转载 RabbitMQ

RabbitMQ1.RabbitMQ 的高可用性基于主从(非分布式)做高可用性的RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。单机模式基本都在本地玩,生产没人用.普通集群模式普通集群模式,意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。你消费

2020-12-24 21:35:47 97 1

原创 RocketMQ

RocketMQ1.消息积压解决方案1. 提高消费并行度绝大部分消息消费行为都属于 IO 密集型,即可能是操作数据库,或者调用 RPC,这类消费行为的消费速度在于后端数据库或者外系统的吞吐量,通过增加消费并行度,可以提高总的消费吞吐量,但是并行度增加到一定程度,反而会下降。所以,应用必须要设置合理的并行度。 如下有几种修改消费并行度的方法:同一个 ConsumerGroup 下,通过增加 Consumer 实例数量来提高并行度(需要注意的是超过订阅队列数的 Consumer 实例无效)。可以

2020-12-24 21:35:26 254 1

转载 Elasticsearch

Elasticsearch1.es 的核心概念Near Realtime近实时,有两层意思: 从写入数据到数据可以被搜索到有一个小延迟(大概是 1s) 基于 es 执行搜索和分析可以达到秒级 Cluster 集群集群包含多个节点,每个节点属于哪个集群都是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。Node 节点Node 是集群中的一个节点,节点也有一个名称,默认是随机分配的。默认节点会去加入一个名称为 elasticsearch 的集

2020-12-24 21:34:37 164 1

原创 分布式缓存

分布式缓存1.项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?项目中缓存是如何使用的?这个,需要结合自己项目的业务来。为什么要用缓存?用缓存,主要有两个用途:高性能、高并发。高性能对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。高并发mysql 这么重的数据库,压根儿设计不是让你玩儿高并发的,虽然也可以玩儿,但是天然支持不好。mysql 单机支撑到 2000QPS 也

2020-12-24 21:34:04 139 1

转载 Redis

Redis1.redis 和 memcached 有什么区别?redis 支持复杂的数据结构redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。redis 原生支持集群模式在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。性能对比由于 redis 只使用单核,而 memcache

2020-12-24 21:30:18 249 1

空空如也

空空如也

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

TA关注的人

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