![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
猪猪猪猪猪鸭
十年磨一剑。
展开
-
快速理解Linux内核态与用户态
原创 2018-03-15 11:25:04 · 270 阅读 · 0 评论 -
java面试-数据库事务详解
什么是『事务』?事务就是一组具有原子性的操作,这一组操作要么全都正确执行,要么全都不执行。 事务能保证数据库从一种一致性状态转换为另一种一致性状态。事务的四大特性ACID1. 原子性原子性指的是事务是一个不可分割的操作,要么全都正确执行,要么全都不执行。2. 一致性事务开始前和事务结束后,数据库的完整性约束没有被破坏。3. 隔离性事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在...原创 2018-03-21 10:28:06 · 523 阅读 · 0 评论 -
java面试-数据库索引全面解析
索引是什么?数据库中查找操作非常普遍,索引就是提升查找速度的一种手段。索引分类B+树索引 它就是传统意义上的索引,它是最常用、最有效的索引。哈希索引 哈希索引是一种自适应的索引,数据库会根据表的使用情况自动生成哈希索引,我们人为是没办法干预的。全文索引 用于实现关键词搜索。但它只能根据空格分词,因此不支持中文。 若要实现搜索功能,可选择lucene。RTree索引 在mysql很少使用,仅支持ge...原创 2018-03-21 10:27:32 · 1959 阅读 · 0 评论 -
深入理解JVM(九)——类加载的过程
通过之前的介绍可知,类加载过程共有5个步骤,分别是:加载、验证、准备、解析、初始化。其中,验证、准备、解析称为连接。下面详细介绍这5个过程JVM所做的工作。加载注意:“加载”是“类加载”过程的第一步,千万不要混淆。1. 加载的过程在加载过程中,JVM主要做3件事情:通过一个类的全限定名来获取这个类的二进制字节流,即class文件: 在程序运行过程中,当要访问一个类时,若发现这个类尚未被加载,并满...原创 2018-03-20 00:14:32 · 300 阅读 · 0 评论 -
深入理解JVM(八)——类加载的时机
类的生命周期一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载——>验证——>准备——>解析——>初始化——>使用——>卸载其中,类加载包括5个阶段: 加载——>验证——>准备——>解析——>初始化在类加载的过程中,以下3个过程称为连接: 验证——>准备——>解析因此,JVM的类加载过程也可以概括为3个过程: 加载—...原创 2018-03-20 00:14:40 · 245 阅读 · 0 评论 -
深入理解JVM(七)——Class文件结构
什么是JVM的“无关性”?Java具有平台无关性,也就是任何操作系统都能运行Java代码。之所以能实现这一点,是因为Java运行在虚拟机之上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现“一次编写,处处运行”。而JVM不仅具有平台无关性,还具有语言无关性。 平台无关性是指不同操作系统都有各自的JVM,而语言无关性是指Java虚拟机能运行除Java以外的代码!这听起来非常惊人,但JV...原创 2018-03-20 00:14:48 · 252 阅读 · 0 评论 -
深入理解JVM(六)——JVM性能调优实战
如何在高性能服务器上进行JVM调优?为了充分利用高性能服务器的硬件资源,有两种JVM调优方案,它们都有各自的优缺点,需要根据具体的情况进行选择。1. 采用64位操作系统,并为JVM分配大内存我们知道,如果JVM中堆内存太小,那么就会频繁地发生垃圾回收,而垃圾回收都会伴随不同程度的程序停顿,因此,如果扩大堆内存的话可以减少垃圾回收的频率,从而避免程序的停顿。因此,人们自然而然想到扩大内存容量。而32...原创 2018-03-20 00:14:57 · 393 阅读 · 0 评论 -
深入理解JVM(五)——HotSpot垃圾收集器详解
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。我们可以根据自己实际的应用需求选择最适合的垃圾收集器。根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率。 新生代垃圾收集器1. Serial垃圾收集器单线程 只开启一条GC线程进行垃圾回收,并且在垃圾回收过程中停止一切用户线程,从而用户的请求或图形化...原创 2018-03-20 00:15:04 · 235 阅读 · 0 评论 -
java面试-数据库三大范式
第一范式第一范式(1NF)要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。第二范式满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式要求实体中没一行的所有非主属性都必须完全依...原创 2018-03-21 10:28:43 · 756 阅读 · 0 评论 -
java面试-彻底搞懂红黑树
红黑树性质1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个儿子都是黑色的。 5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。和AVL树的比较AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的...原创 2018-03-21 10:53:52 · 25435 阅读 · 19 评论 -
Java并发编程的艺术(十三)——锁优化
自旋锁背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。原理:当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,该过程称为『自旋』。优点:由于自旋等待锁的过程线程并不会引起上下文切换,因此比较高效;缺点:自旋等待过程线程一直占...原创 2018-05-12 10:26:25 · 259 阅读 · 0 评论 -
Java并发编程的艺术(十二)——线程安全
1. 什么是『线程安全』?如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。2. 线程安全的几种程度线程安全性的前提:对『线程安全性』的讨论必须建立在对象内部存在共享变量这一前提,若对象在多条线程间没有共享数据,那这个对象一定是线程安全的!2.1. 绝对的线程安全上述线程安全性的定义即为绝对线程安全的情况,即:一个对象在构造完...原创 2018-05-12 10:24:22 · 311 阅读 · 0 评论 -
Java中静态跟非静态的区别总结
一.静态变量跟实例变量的区别: 1.静态变量:由static修饰,在JVM中,静态变量的加载顺序在对象之前,因此静态变量不依附于对象存在,可以在不实例化类的情况下直接使用静态变量,如下代码所示。public class StaticTest { static int a = 13; int b = 14; public static void main(String[] ...原创 2018-04-13 12:05:25 · 379 阅读 · 0 评论 -
CAS原理分析
一、锁机制常用的锁机制有两种:1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查是否违反数据完整性。如果因为冲突失败就重试,直到成功为止。乐观锁大多是基于数据版本记录机制实现。为数据增加...原创 2018-04-12 18:08:48 · 238 阅读 · 1 评论 -
架构高性能网站秘笈(三)——浏览器缓存
什么是浏览器缓存?在《架构高性能网站秘笈(二)——动态内容缓存》中我们知道,当不同用户请求相同数据时,动态内容缓存能够避免服务器的重复计算,从而降低用户的等待时间。但如果是同一个用户请求相同的数据,即使服务器能避免重复计算,但仍需将重复的数据传递给浏览器。若使用浏览器缓存,则同一个用户请求相同的数据时,浏览器只需从自己本地读取,无需从服务器上获取。从而大大降低用户的等待时间,减少了服务器的压力,可...原创 2018-03-21 14:41:52 · 222 阅读 · 0 评论 -
架构高性能网站秘笈(二)——动态内容缓存
什么是动态内容缓存?浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生成的HTML返回给浏览器显示。我们知道,数据库读取操作是非常耗时的,如果能将每次请求中的数据库处理时间去掉,那服务器的相应速度将会大幅提升。要实现这一点,我们就需要将常用的HTML页面事先生成好,当用户发出请求时,服务器只需从缓存中取出即可,无...原创 2018-03-21 14:40:56 · 198 阅读 · 0 评论 -
架构高性能网站秘笈(一)——了解衡量网站性能的指标
服务器如何发送数据?服务器程序将需要发送的数据写入该程序的内存空间中;服务器程序通过操作系统的接口向内核发出系统调用;系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取;此后CPU转而做其他处理;网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;网卡将字节转换成二进制位,再以电信号的形式输出至网络。注意:数据在计算机内部的复制是按照总线的宽度来复制的。比如在32位的操作...原创 2018-03-21 14:40:16 · 566 阅读 · 0 评论 -
java面试-计算机网络传输层知识点全覆盖
点击打开网络通信的七层协议传输层概述作用:传输层为它上面的应用层提供通信服务。在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。传输层两大重要的功能:复用 和 分用。 复用:在发送端,多个应用进程公用一个传输层;分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。和网络层的区别: 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。网络层只对报文...原创 2018-03-21 13:20:39 · 1487 阅读 · 0 评论 -
深入理解JVM(四)——对象内存的分配策略
Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配。在Java虚拟机的五块内存空间中,程序计数器、Java虚拟机栈、本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要分配的内存大小,并且由于都是线程私有,因此它们的内存空间都随着线程的创建而创建,线程的结束而回收。也就是这三个区域的内存分配和回收都具有确定性,垃圾回收器不需要在这里花费太大的精力。而Java虚拟机中...原创 2018-03-20 00:15:12 · 351 阅读 · 0 评论 -
深入理解JVM(三)——垃圾收集策略详解
Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题。 ...原创 2018-03-20 00:15:21 · 328 阅读 · 0 评论 -
Java并发编程的艺术(七)——Executors
Executors框架简介Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。E...原创 2018-03-19 15:30:35 · 231 阅读 · 0 评论 -
Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
1. 闭锁:CountDownLatch1.1 使用场景若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。1.2 代码实现// 初始化闭锁,并设置资源个数CountDownLatch latch = new CountDownLatch(2);Thread t1 = new Thread( new Runnable(){ public ...原创 2018-03-19 15:29:33 · 272 阅读 · 0 评论 -
Java并发编程的艺术(九)——批量获取多条线程的执行结果
当向线程池提交callable任务后,我们可能需要一次性获取所有返回结果,有三种处理方法。方法一:自己维护返回结果// 创建一个线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 存储执行结果的ListList<Future<String>> results = new A...原创 2018-03-19 15:28:23 · 337 阅读 · 1 评论 -
Java并发编程的艺术(十一)——线程池(2)
Executor两级调度模型 在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程。 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执行它们; 在操作系统层面,操作系统再将这些线程分配给处理器执行。Executor结构 Executor框架中的所有类可以分成三类:任务 任务有两种类型:Runnable和Callable。任务执行器 ...原创 2018-03-19 15:26:50 · 294 阅读 · 0 评论 -
脏读,幻读,不可重复读解释和例子
原创 2018-03-17 15:50:50 · 2928 阅读 · 0 评论 -
GC Roots是什么
原创 2018-03-16 20:20:31 · 5373 阅读 · 2 评论 -
JVM面试就靠这个就够了
什么是GC Roots 点击跳转解释原创 2018-03-16 20:22:13 · 219 阅读 · 0 评论 -
Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。1. volatile、synchronized关键字PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)——volatile1.1 如何实现通信?这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个共享变量被volatile修饰 或...原创 2018-03-19 15:31:20 · 443 阅读 · 1 评论 -
Java并发编程的艺术(五)——中断
什么是中断?在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位...原创 2018-03-19 15:32:06 · 312 阅读 · 0 评论 -
深入理解JVM(二)——揭开HotSpot对象创建的奥秘
对象的创建过程当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没有这个类的符号引用,说明这个类还没有被定义!抛出ClassNotFoundException; 若常量池中有这个类的符号引用,则进行下一步工作; 进而检查这个符号引用所代表的类是否已经被JVM加载; 若该类还没有被加...原创 2018-03-20 00:15:27 · 328 阅读 · 0 评论 -
深入理解JVM(一)——JVM内存模型
JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。下面对这五个区域展开深入的介绍。 1. 程序计数器1.1. 什么是程序计数器?程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正...原创 2018-03-20 00:15:35 · 2611 阅读 · 0 评论 -
java-面试-Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-03-20 00:15:42 · 3829 阅读 · 0 评论 -
Java并发编程的艺术(一)——并发编程需要注意的问题
并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题:上下文切换死锁资源限制接下来会逐一分析这三个问题,并给出相应的解决方案。问题一:上下文切换会带来额外的开销线程的运行机制一个CPU每个时刻只能执行一条线程;操作系统给每条线程分配不同长度的时间片;操作系统会从一堆线程中随机选取一条来执行;每条线程用完自...原创 2018-03-20 00:15:56 · 439 阅读 · 0 评论 -
正向代理和反向代理
正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。结论就是,正向代理,是一个位于客户端和原始服务器(origin server)...原创 2018-03-24 10:25:07 · 198 阅读 · 0 评论 -
Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此。什么是重排序?重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。重排序分类重排序分为:编译器重排序 和 处理器重排序。数据依赖编译器和处理器并不会随意的改变指令的执行顺序,因为有些指令之间是有依赖关系的,若改变了他们的执行顺序,就会出现错误的结果。 因此,编译器和处理器只...原创 2018-03-19 15:35:01 · 329 阅读 · 0 评论 -
Java并发编程的艺术(三)——volatile
1. 并发编程的两个关键问题并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 与 同步。通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步。通信和同步是相辅相成的。同步 同步是指,控制多条线程之间的执行次序...原创 2018-03-19 15:34:13 · 324 阅读 · 0 评论 -
Java并发编程的艺术(四)——线程的状态
线程的状态初始态:NEW创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。运行态:RUNNABLE在Java中,运行态包括就绪态 和 运行态。就绪态 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。所有就绪态的线程存放在就绪队列中。运行态 获得CPU执行权,正在执行的线程。由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行...原创 2018-03-19 15:33:20 · 312 阅读 · 1 评论 -
Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-05-12 10:29:08 · 794 阅读 · 3 评论