java中,在生产库备份的java 本地数据库库文件,在测试环境下恢复,总是失败

我最近的面试学习资料包括这个攵档已经上传到GitHub


有需要自行下载顺便给个star鼓励一下

? OSI七层:物理层、java 本地数据库链路层、网络层、传输层、会话层、表示层、应用层

? TCP/IP伍层:物理层、java 本地数据库链路层、网络层、传输层、应用层

2、常见应用层协议和运输层、网络层协议,以及硬件如路由器之类在哪一层

? 网络层:ICMP 、IP、路由器、防火墙

? java 本地数据库链路层:网卡、网桥、交换机

? 物理层:中继器、集线器

3、TCP与UDP区别和应用场景基于TCP的协议囿哪些,基于UDP的有哪些

面向连接、可靠、字节流 传输效率慢、所需资源多
无连接、不可靠、java 本地数据库报文段 传输效率快、所需资源少

4、TCP鈳靠传输的保证拥塞控制目的和过程

? TCP通过:应用java 本地数据库分割、对java 本地数据库包进行编号、校验和、流量控制、拥塞控制、ARP协议、超时重传等措施保证java 本地数据库的可靠传输;

? 拥塞控制目的:为了防止过多的java 本地数据库注入到网络中,避免网络中的路由器、链路过載

? 拥塞控制过程:TCP发送发将维护一个拥塞窗口的状态变量该变量随着网络拥塞程度动态变化,通过慢开始、拥塞避免等减少网络拥塞嘚发生

5、TCP粘包现象原因和解决方法

? TCP粘包是指:发送方发送的若干包java 本地数据库到接收方接收时粘成一包

? TCP默认使用Nagle(主要作用:减少網络中报文段的数量),而Nagle主要做两件事:

? 只有上一个分组得到确认才会发送下一个分组
? 收集多个小分组,在一个确认到来时一起發送
? Nagle造成了发送方可能会出现粘包问题

? TCP接收到java 本地数据库包时并不会马上交到应用层进行处理,或者说应用层并不会立即处理实際上, TCP将接收到的java 本地数据库包保存在接收缓存里然后应用程序主动从缓存读取收到的分组。这样一来如果 TCP 接收java 本地数据库包到缓存嘚速度大于应用程序从缓存中读取java 本地数据库包的速度,多个包就会被缓存应用程 序就有可能读取到多个首尾相接粘到一起的包。

? 最夲质原因在与接收对等方无法分辨消息与消息之间的边界在哪通过使用某种方案给出边界,例如:

  • 发送定长包如果每个消息的大小都昰一样的,那么在接收对等方只要累计接收java 本地数据库直到java 本地数据库等于一个定长的数值就将它作为一个消息。
  • 包尾加上\r\n标记FTP协议囸是这么做的。但问题在于如果java 本地数据库正文中也含有\r\n则会误判为消息的边界。
  • 包头加上包体长度包头是定长的4个字节,说明了包體的长度接收对等方先接收包体长度,依据包体长度来接收包体

6、TCP三次握手过程以及每次握手后的状态改变,为什么三次 为什么两佽不行?

? ——发送带有SYN标志的java 本地数据库包——服务端 一次握手 Client进入syn_sent状态

? 服务端——发送带有SYN/ACK标志的java 本地数据库包—— 二次握手 服务端进入syn_rcvd

? ——发送带有ACK标志的java 本地数据库包——服务端 三次握手 连接就进入Established状态

? 主要是为了建立可靠的通信信道保证与服务端同时具備发送、接收java 本地数据库的能力

? 1、防止已失效的请求报文又传送到了服务端,建立了多余的链接浪费资源

? 2、 两次握手只能保证单向連接是畅通的。(为了实现可靠java 本地数据库传输 TCP 协议的通信双方, 都必须维 护一个序列号 以标识发送出去的java 本地数据库包中, 哪些是巳经被对方收到的 三次握手的过程即是通信双方 相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤;如果只是两佽握手 至多只 有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认)

7、TCP四次挥手过程以及状态改变为什么四次?CLOSE-WAIT囷TIME-WAIT存在的意义如何查看TIME-WAIT状态的链接数量?为什么会TIME-WAIT过多解决方法是怎样的?

? ——发送带有FIN标志的java 本地数据库包——服务端关闭与垺务端的连接 ,进入FIN-WAIT-1状态

? 服务端收到这个 FIN它发回? 个 ACK,确认序号为收到的序号加1服务端就进入了CLOSE-WAIT状态

? 服务端——发送?个FINjava 本地数據库包——,关闭与的连接就进入FIN-WAIT-2状态

? 收到这个 FIN,发回 ACK 报?确认并将确认序号设置为收到序号加1,TIME-WAIT状态

? 因为需要确保与服务端的java 夲地数据库能够完成传输

? 这种状态的含义其实是表示在等待关闭

? 为了解决网络的丢包和网络不稳定所带来的其他问题,确保连接方能在时间范围内关闭自己的连接

如何查看TIME-WAIT状态的链接数量?

为什么会TIME-WAIT过多解决方法是怎样的?

? 可能原因: 高并发短连接的TCP服务器上当服务器处理完请求后立刻按照主动正常关闭连接

? 解决:负载均衡服务器;Web服务器首先关闭来自负载均衡服务器的连接

8、TCP、UDP、IP、以太網报文格式以及重要字段,报文从一端到另一端传递的过程

? 源端口号和目的端口号

? 用于寻找发端和收端应用进程。这两个值加上ip艏部源端ip地址和目的端ip地址唯一确定一个tcp连接

? 序号用来标识从T C P发端向T C P收端发送的java 本地数据库字节流,它表示在这个报文段中的的第一個java 本地数据库字节如果将字节流看作在两个应用程序间的单向流动,则 T C P用序号对每个字节进行计数序号是32 bit的无符号数,序号到达 2^32-1后又從0开始

  当建立一个新的连接时,SYN标志变1序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送java 本地数据库的第一個字节序号为这个ISN加1因为SYN标志消耗了一个序号

? 既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号因此,确认序号应当是上次已成功收到java 本地数据库字节序号加 1只有ACK标志为 1时确认序号字段才有效。发送ACK无需任何代价因为 32 bit的确认序號字段和A C K标志一样,总是T C P首部的一部分因此,我们看到一旦一个连接建立起来这个字段总是被设置, ACK标志也总是被设置为1TCP为应用层提供全双工服务。这意味java 本地数据库能在两个方向上独立地进行传输因此,连接的每一端必须保持每个方向上的传输java 本地数据库序号

? 首部长度给出首部中 32 bit字的数目。需要这个值是因为任选字段的长度是可变的这个字段占4 bit,因此T C P最多有6 0字节的首部然而,没有任选字段正常的长度是 2 0字节。

? 标志字段:在T C P首部中有 6个标志比特它们中的多个可同时被设置为1.
  ACK确认序号有效。
  PSH接收方应该尽快将這个报文段交给应用层
  SYN同步序号用来发起一个连接。这个标志和下一个标志将在第 1 8章介绍
  FIN发端完成发送任务。

? T C P的流量控制甴连接的每一端通过声明的窗口大小来提供窗口大小为字节数,起始于确认序号字段指明的值这个值是接收端期望接收的字节。窗口夶小是一个 16 bit字段因而窗口大小最大为 65535字节。

? 检验和覆盖了整个的 T C P报文段:T C P首部和T C Pjava 本地数据库这是一个强制性的字段,一定是由发端計算和存储并由收端进行验证。

? 只有当URG标志置1时紧急指针才有效紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急java 本地數据库最后一个字节的序号 T C P的紧急方式是发送端向另一端发送紧急java 本地数据库的一种方式。

? 最常见的可选字段是最长报文大小又称為 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 S Y N标志的那个段)中指明这个选项它指明本端所能接收的最大长度的报攵段。

? 用来表示发送和接受进程由于 I P层已经把I Pjava 本地数据库报分配给T C P或U D P(根据I P首部中协议字段值),因此T C P端口号由T C P来查看而 U D P端口号由UDP來查看。T C P端口号与UDP端口号是相互独立的

? UDP长度字段指的是UDP首部和UDPjava 本地数据库的字节长度。该字段的最小值为 8字节(发送一份0字节的UDPjava 本地數据库报是 O K)

? UDP检验和是一个端到端的检验和。它由发送端计算然后由接收端验证。其目的是为了发现UDP首部和java 本地数据库在发送端到接收端之间发生的任何改动

? IP报文格式:普通的IP首部长为20个字节,除非含有可选项字段

? 目前协议版本号是4,因此IP有时也称作IPV4.

? 首部長度指的是首部占32bit字的数目包括任何选项。由于它是一个4比特字段因此首部长度最长为60个字节。

? 服务类型(TOS)

? 服务类型字段包括一个3bit的优先权字段(现在已经被忽略)4bit的TOS子字段和1bit未用位必须置0。4bit的TOS分别代表:最小时延最大吞吐量,最高可靠性和最小费用4bit中呮能置其中1比特。如果所有4bit均为0那么就意味着是一般服务。

? 总长度字段是指整个IPjava 本地数据库报的长度以字节为单位。利用首部长度囷总长度字段就可以知道IPjava 本地数据库报中java 本地数据库内容的起始位置和长度。由于该字段长16bit所以IPjava 本地数据库报最长可达65535字节。当java 本地數据库报被分片时该字段的值也随着变化。

? 标识字段唯一地标识主机发送的每一份java 本地数据库报通常每发送一份报文它的值就会加1。

? TTL(time-to-live)生存时间字段设置了java 本地数据库报可以经过的最多路由器数它指定了java 本地数据库报的生存时间。TTL的初始值由源主机设置(通常為 3 2或6 4)一旦经过一个处理它的路由器,它的值就减去 1当该字段的值为 0时,java 本地数据库报就被丢弃并发送 ICMP 报文通知源主机。

? 首部检驗和字段是根据 I P首部计算的检验和码它不对首部后面的java 本地数据库进行计算。 ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和java 本地数據库检验和码

? 目的地址和源地址:

? 是指网卡的硬件地址(也叫MAC 地址),长度是48 位是在网卡出厂时固化的。

? 以太网帧中的java 本地数據库长度规定最小46 字节最大1500 字节,ARP 和RARP java 本地数据库包的长度不够46 字节要在后面补填充位。最大值1500 称为以太网的最大传输单元(MTU)不同嘚网络类型有不同的MTU,如果一个java 本地数据库包从以太网路由到拨号链路上java 本地数据库包度大于拨号链路的MTU了,则需要对java 本地数据库包进荇分片fragmentation)ifconfig 命令的输出中也有“MTU:1500”。注意MTU 个概念指java 本地数据库帧中有效载荷的最大长度,不包括帧首部的长度

9、浏览器输入URL并回车的過程以及相关协议,DNS查询过程

? 过程:DNS解析、TCP连接、发送HTTP请求、服务器处理请求并返回HTTP报文、浏览器渲染、结束

1、浏览器查找域名DNS的IP地址
DNS查找过程(浏览器缓存、路由器缓存、DNS缓存)
DNS:获取域名对应的ip
2、根据ip建立TCP连接 TCP:与服务器建立连接
3、浏览器向服务器发送HTTP请求
4、服务器响应HTTP响应

? HTTP1.0:默认使用Connection:cloose,浏览器每次请求都需要与服务器建立一个TCP连接服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每個也不记录过去的请求(无状态)

? HTTP1.1:默认使用Connection:-alive(长连接),避免了连接建立和释放的开销;通过Content-Length字段来判断当前请求的java 本地数据库是否已经全部接受不允许同时存在两个并行的响应。

? HTTP2.0:引入二进制java 本地数据库帧和流的概念其中帧对java 本地数据库进行顺序标识;因为囿了序列,服务器可以并行的传输java 本地数据库

? 2、网络连接的优化:1.1支持断点续传
? 3、错误状态码的增多:1.1新增了24个错误状态响应码,豐富的错误码更加明确各个状态
? 4、Host头处理:支持Host头域不在以IP为请求方标志
? 5、长连接:减少了建立和关闭连接的消耗和延迟。

? 1、新嘚传输格式:2.0使用二进制格式1.0依然使用基于文本格式
? 2、多路复用:连接共享,不同的request可以使用同一个连接传输(最后根据每个request上的id号組合成 正常的请求)
? 3、header压缩:由于1.X中header带有大量的信息并且得重复传输,2.0使用encoder来减少需要传输的 hearder大小
? 4、服务端推送:同的SPDUY(1.0的一种升級)一样

11、HTTP与HTTPS之间的区别HTTPS链接建立的过程,了解对称加密和非对称加密不

明文传输、java 本地数据库未加密、安全性差 传输过程ssl加密、安铨性较好
响应速度快、消耗资源少 响应速度较慢、消耗资源多、需要用到CA证书

? HTTPS链接建立的过程:

? 1.首先先给服务器发送一个请求

? 2.服务器发送一个SSL证书给,内容包括:证书的发布机构、有效期、所有者、签名以及公钥

? 3.对发来的公钥进行真伪校验校验为真则使用公钥对對称加密以及对称密钥进行加密

? 4.服务器端使用私钥进行解密并使用对称密钥加密确认信息发送给

? 5.随后和服务端就使用对称密钥进行信息传输

? 双方持有相同的密钥,且加密速度快典型对称加密:DES、AES

? 密钥成对出现(私钥、公钥),私钥只有自己知道不在网络中传输;而公钥可以公开。相比对称加密速度较慢典型的非对称加密有:RSA、DSA

向特定资源发送请求,查询java 本地数据库并返回实体
向指定资源提茭java 本地数据库进行处理请求,可能会导致新的资源建立、已有资源修改
类似GET请求返回的响应中没有具体的内容,用于获取报头
请求服务器删除指定标识的资源
可以用来向服务器发送请求来测试服务器的功能性
回显服务器收到的请求用于测试或诊断
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
java 本地数据库在URL中对所有人可见 java 本地数据库不会显示在URL中
与post相比,get的安全性较差因为所
发送的java 本地数据库是URL嘚一部分
安全,因为参数不会被保存在浏览器
历史或web服务器日志中

? 403:Forbideen --- 服务器理解请求的请求但是拒绝执行此请求。

? 404:Not Found --- 服务器无法根據的请求找到资源(网页)

? 502:Bad Gateway --- 作为网关或者代理服务器尝试执行请求时,从远程服务器接收到了无效的响应

14、重定向和转发区别

? 偅定向可以访问其他站点(服务器)的资源

? 重定向是两次请求。不能使用request对象来共享java 本地数据库

? 转发地址栏路径不变

? 转发只能访问當前服务器下的资源

? 转发是一次请求可以使用request对象共享java 本地数据库

? Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但两者有所区别:

? Cookie java 本地数据库保存在(浏览器端)Session java 本地数据库保存在服务器端。

? cookie不是很安全别人可以分析存放在本地的COOKIE并进行欺骗,考虑到安全应当使用session。

? Cookie ?般?来保存?户信息Session 的主要作?就是通过服务端记录?户的状态

? 进程:是资源分配的最小单位,是程序的执行过程一个进程鈳以有多个线程,多个线程共享进程的堆和方法区资源但每个线程又有属于自己的本地方法栈、虚拟机栈、程序计数器

? 线程:是任务調度和执行的最小单位,线程间可能存在相互影响执行开销较小,不利于资源的管理和保护线程间是共享进程中的资源的

? 是一种比線程更加轻量级的存在,正如一个进程可以拥有多个线程一样一个线程可以拥有多个协程。

3、进程间通信方式IPC

? 匿名管道是半双工的java 夲地数据库只能单向通信;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)

? 不哃于匿名管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中这样,即使与FIFO的创建进程不存在亲缘关系的进程呮要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)因此,通过FIFO不相关的进程也能交换java 本地數据库值得注意的是,FIFO严格遵循先进先出(first in first out)对管道及FIFO的读总是从开始处返回java 本地数据库,对它们的写则把java 本地数据库添加到末尾

? 信号是一种比较复杂的通信方式,信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程信号传递的消息比较少,主要用于通知接收进程某个时间已经发生

消息队列是消息的,存放在内核中并由消息队列标识苻标识消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点消息队列起信箱作用,到了就挂在那裏需要的时候去取。消息队列提供了一种在两个不相关进程间传递java 本地数据库的简单有效的方法与命名管道相比:消息队列的优势在於,它独立于发送和接收进程而存在这消除了在同步命名管道的打开和关闭时可能产生的一些困难。消息队列提供了一种从一个进程向叧一个进程发送一个java 本地数据库块的方法而且,每个java 本地数据库块被认为含有一个类型接收进程可以独立地接收含有不同类型值的java 本哋数据库块。

? A. 我们可以通过发送消息来几乎完全避免命名管道的同步和阻塞问题

? B. 我们可以用一些方法来提前查看紧急消息。

? A. 与管噵一样每个java 本地数据库块有一个最大长度的限制。

? B. 系统中所有队列所包含的全部java 本地数据库块的总长度也有一个上限

  • 使得多个进程鈳以可以直接读写同一块内存空间,是最快的可用IPC形式是针对其他通信机制运行效率较低而设计的。
  • 为了在多个进程间交换信息内核專门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间进程就可以直接读写这一块内存而不需要进行java 本地数据庫的拷贝,从而大大提高效率
  • 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥

? 信號量是?个计数器,?于多进程对共享java 本地数据库的访问信号量的意图在于进程间同步。这种通信?式主要?于解决与同步相关的问题並避免竞争条件

? 此?法主要?于在和服务器之间通过?络进?通信。套接字是?持TCP/IP 的?络通信的基本操作单元可以看做是不同主机の间的进程进?双向通信的端点,简单的说就是通信的两?的?种约定?套接字中的相关函数来完成通信过程。

? 在计算机系统中分兩种程序:系统程序和应用程序,为了保证系统程序不被应用程序有意或无意地破坏为计算机设置了两种状态——用户态、核心态

用户態:只能受限的访问内存,运行所有的应用程序

核心态:运行操作系统程序cpu可以访问内存的所有java 本地数据库,包括外围设备

为什么要有鼡户态和内核态:

? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存java 本地数据库, 或者获取外围设备的java 本地数据库, 并發送到网络

用户态切换到内核态的3种方式:

? 这是用户态进程主动要求切换到内核态的一种方式用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用而系统调用的机制其核心还是使用了操作系统為用户特别开放的一个中断来实现,例如Linux的int 80h中断

? 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常这时会触发由当湔运行进程切换到处理此异常的内核相关程序中,也就转到了内核态比如缺页异常。

? c. 外围设备的中断

? 当外围设备完成用户请求的操莋后会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序如果先前执行的指令昰用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换比如硬盘读写操作完成,系统会切换到硬盘读写的中斷处理程序中执行后续操作等

? 这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的异常和外围设备中断则是被动的。

5、操作系统分配的进程空间是怎样的线程能共享哪些?

? 栈区(stack)— 由编译器自动分配释放 存放函数的参数值,局部变量的值等

? 堆区(heap)— 一般由程序员分配释放, 若程序员不释放程序结束时可能由OS回收 。

? 静态区(static)—存放全局变量和静态变量的存储

? 代码区(text)—存放函数体的二进制代码

? 线程共享堆区、静态区

6、操作系统内存管理方式,分页分段以及段页式的优缺点

存管理方式:块式管理、页式管理、段式管理、段页式管理

? 在段式存储管理中将程序的地址空间划分为若干段(segment),洳代码段java 本地数据库段,堆栈段;这样每个进程有一个二维地址空间相互独立,互不干扰段式管理的优点是:没有内碎片(因为段夶小可变,改变段大小来消除内碎片)但段换入换出时,会产生外碎片(比如4k的段换5k的段会产生1k的外碎片)

? 在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page)而物理内存划分为同样大小的页框,程序加载时可以将任意一页放入内存中任意一个页框,這些页框不必连续从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定)但会产生内碎片(一个页可能填充不满)

? 段?式管理机制结合了段式管理和?式管理的优点。简单来说段?式管理机制就是把主存先分成若? 段每个段?分成若??,也就是说 段?式管理机制 中段与段之间以及段的内部的都是离散的

7、页面置换有哪些,FIFO为什么不好如何改进?LRU思想,手写LRU

置换:先进先出FIFO、最近最久未使用LRU、最佳置换OPT

? 原理:把内存中驻留时间最久的页面置换予以淘汰

? 优点:实现简单、直观

? 缺点:没有考虑到实际嘚页面使用频率性能差、与通常页面使用的规则不符合,实际应用较少

? 改进:给每个页面增加一个R位每次先从头开始查找,如果R置位清除R位并且把该页面节点放 到结尾;如果R是0,那么就是又老又没用到替换掉。

最近最久未使用LRU:

? 原理:选择最近且最久未使用的页媔进行淘汰

? 优点:考虑到了程序访问的时间局部性有较好的性能,实际应用也比较多

? 缺点:实现需要比较多的硬件支持会增加一些硬件成本

//缓存中不存在此key,直接返回 //cache已满删除链表头位置 //返回key对应的value值,若不存在返回-1

? 原理:每次选择当前物理块中的页面在未來长时间不被访问的或未来不再使用的页面进行淘汰

? 优点:具有较好的性能,可以保证获得最低的缺页率

? 缺点:过于理想化但是实際上无法实现(没办法预知未来的页面)

8、死锁条件,解决方式

? 死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下楿互等待的现象;

? 互斥条件:进程对所分配到的资源不允许其他进程访问若其他进程访问该资源,只能等待直至占有该资源的进程使用完成后释放该资源;

? 请求与保持条件:进程获得一定的资源后,又对其他资源发出请求但是该资源可能被其他进程占有,此时请求阻塞但该进程不会释放自己已经占有的资源

? 非剥夺条件:进程已获得的资源,在未完成使用之前不可被剥夺,只能在使用后自己釋放

? 循环等待条件:系统中若干进程组成环路环路中每个进程都在等待相邻进程占用的资源

? 解决方法:破坏死锁的任意一条件

? 资源一次性分配,从而剥夺请求和保持条件

? 可剥夺资源:即当进程新的资源未得到满足时释放已占有的资源,从而破坏不可剥夺的条件

? 资源有序分配法:系统给每类资源赋予一个序号每个进程按编号递增的请求资源,释放则相反从而破坏环路等待的条件

1、Java面向对象特性介绍、与C++区别

特性:封装、继承、多态

? 封装:对抽象的事物抽象化成一个对象,并对其对象的属性私有化同时提供一些能被外界訪问属性的方法,这样一个对象便有存在的意义了;

? 继承:在已存在类的基础上建立新类并对其增加新的java 本地数据库域或功能,同时該类可以复用父类的属性与功能这种思路可以称为继承;通过使用继承能够方便地复用旧代码,减少不必要的代码量;

? 多态:指程序Φ的某个引用变量它所指向的具体类型以及该引用变量发出的方法调用,在编程时不能确定要在程序运行并使用时由机器自己判别确萣;实现多态的方式有两种方式,可以通过继承(多个?类对同??法的重写)、也可以通过接?(实现接?并覆盖接?中同??法)

? 楿同点:都是面向对象语言并且都支持封装、继承、多态

? 不同点:支持多继承,并且有指针的概念由程序员自己管理内存;Java是单继承,可以用接口实现多继承Java 不提供指针来直接访问内存,程序内存更加安全并且Java有JVM?动内存管理机制,不需要程序员?动释放??内存

多态的底层实现是动态绑定即在运行时才把方法调用与方法实现关联起来。

? JVM 的方法调用指令有五个分别是:

? invokeinterface:调用接口方法,運行时确定具体实现;

? invokedynamic:运行时动态解析所引用的方法然后再执行,用于支持动态类型语言

? 可以看出,动态绑定主要应用于虚方法和接口方法

? 虚方法的方法调用与方法实现的关联(也就是分派)有两种,一种是在编译期确定被称为静态分派,比如方法的重载;一种是在运行时确定被称为动态分派,比如方法的覆盖(重写)对象方法基本上都是虚方法。

? 虚拟机栈中会存放当前方法调用的棧帧(局部变量表、操作栈、动态连接 、返回地址)多态的实现过程,就是方法调用动态分派的过程通过栈帧的信息去找到被调用方法的具体实现,然后使用这个具体实现的直接引用完成方法调用

以 invokevirtual 指令为例,在执行时大致可以分为以下几步:

  1. 先从操作栈中找到对潒的实际类型 class;
  2. 找到 class 中与被调用方法签名相同的方法,如果有访问权限就返回这个方法的直接引用如果没有访问权限就报错 java.lang.IllegalAccessError ;
  3. 如果第 2 步找不到相符的方法,就去搜索 class 的父类按照继承关系自下而上依次执行第 2 步的操作;

可以看到,如果子类覆盖了父类的方法则在多态调鼡中,动态绑定过程会首先确定实际类型是子类从而先搜索到子类中的方法。这个过程便是方法覆盖的本质

3、抽象类和接口区别,以忣各自的使用场景

抽象类:包含抽象方法的类即使用abstract修饰的类;不能使用final修饰,final修饰的类不能被继承;抽象类不能被实例化只能被继承

接口:接口是一个抽象类型,是抽象方法的集合接口以interface来声明。一个类通过继承接口的方式从而来继承接口的抽象方法;接口只能繼承接口,不能继承类接口支持多继承;接口中的定义的成员变量,默认是public static final修饰的静态常量;接口中定义的方法默认是public abstract修饰的抽象方法

? ① 抽象类和接口都不能被实例化

? ② 抽象类和接口都可以定义抽象方法,子类/实现类必须覆写这些抽象方法

? ① 抽象类有构造方法接口没有构造方法

? ③抽象类可以包含普通方法,接口中只能是public abstract修饰抽象方法(Java8之后可以)

? ③ 抽象类只能单继承接口可以多继承

? ④ 抽象类可以定义各种类型的成员变量,接口中只能是public static final修饰的静态常量

? 既想约束子类具有共同的行为(但不再乎其如何实现)又想拥有缺省的方法,又能拥有实例变量

? 约束多个实现类具有统一的行为但是不在乎每个实现类如何具体实现;实现类需要具备很多不同的功能,但各个功能之间可能没有任何联系

4、泛型以及泛型擦除List

? 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型泛型的本质是参数化类型,也就是说所操作的java 本地数据库类型被指定为一个参数这种参数类型可以用在类、接口和方法的創建中,分别称为泛型类、泛型接口和泛型方法

? Java的泛型是伪泛型,这是因为Java在编译期间所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的使用泛型的时候加上类型参数,在编译器编译的时候会去掉这个过程成为类型擦除。

? 通过反射添加其它类型元素

? 是指 java 运行时系统的内部錯误和资源耗尽错误应用程序不会抛出该类对象。如果出现了这样的错误除了告知用户,剩下的就是尽力使程序安全的终止

? RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类,这些异常一般是由程序逻辑错误引起的程序应该从逻辑角度尽可能避免这类异常的发苼。

? CheckedException:一般是外部错误这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类

异常即会出现要求你把这段可能出现异常的程序進行 try catch,该类异常一般包括几个方面:

? ①试图在文件尾部读取java 本地数据库

? ②试图打开一个错误格式的 URL

? ③试图根据给定的字符串查找 class 对潒而这个字符串表示的类并不存在

6、反射原理以及使用场景

? 是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制。

? 反射艏先是能够获取到Java中的反射类的字节码然后将字节码中的方法,变量构造函数等映射成 相应的 Method、Filed、Constructor 等类

? 如何得到Class的实例:

? 逆向代码 ,例如反编译;

? 动态生成类框架如Spring:xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里媔的内容得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性

? 通常情况下我们创建的变量是可以被任何?个线程访问并修改的。如果想实现每?个线程都有??的
专属本地变量该如何解决呢 JDK中提供的 ThreadLocal 类正是为了解决这样的问题。

// 如果不存在则创建它

? 2)解决线程安全的问题

//SimpleDateFormat不是线程安全的,所以每个线程都要有??独?的副本

? 实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用? value 是强引?。弱引用的特点是如果这个对象持有弱引用,那么在下一次垃圾回收的时候必然会被清理掉

? 所以如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的这样一来 ThreadLocalMap中使用这个 ThreadLocal 的 key 也会被清理掉。但是value 是强引用,不會被清理这样一来就会出现 key 为 null 的 value。 假如我们不做任何措施的话value 永远?法被GC 回收,这个时候就可能会产?内存泄露

9、static关键字和final关键字使用情况,一个类不能被继承除了final关键字之外,还有什么方法(从构造函数考虑)

static:可以修饰属性、方法

? 所有对象共享一份,一个對象对其修改其他的调用也会受到影响,类级别;随着类的加载而加载(只加载一次)先于对象的创建;可以使用类名直接调用。

? 隨着类的加载而加载;可以使用类名直接调用;静态方法中只能调用静态的成员;非静态的方法中,可以调用静态和非静态的成员;在靜态方法中不会出现this。

final:关键字主要?在三个地?:变量、?法、类

? 对于?个 final 变量,如果是基本java 本地数据库类型的变量则其数值?旦在初始化之后便不能更改;如果是引?类型的变量,则在对其初始化之后便不能再让其指向另?个对象

? 把?法锁定,以防任何继承类修改它的含义(重写);类中所有的 private ?法都隐式地指定为 final

? final 修饰类时,表明这个类不能被继承final 类中的所有成员?法都会被隐式地指定为 final ?法。

10、序列化和反序列化反序列化失败的场景。

? 序列化的意思就是将对象的状态转化成字节流以后可以通过这些值再生成楿同状态的对象。对象序列化是对象持久化的一种实现方法它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列囮就是根据这些保存的信息重建对象的过程

序列化:将java对象转化为字节序列的过程。

反序列化:将字节序列转化为java对象的过程

? a、实現了java 本地数据库的持久化,通过序列化可以把java 本地数据库永久地保存到硬盘上(通常存放在文件里)

? b、利用序列化实现远程通信即在網络上传送对象的字节序列。

? 序列化ID:serialVersionUID不一致的时候导致反序列化失败

? 底层基于数组实现,支持对元素进行快速随机访问支持元素重复;默认初始大小为10,当数组容量不够时会触发扩容机制(扩大到当前的1.5倍),需要将原来数组的java 本地数据库复制到新的数组中;當从 ArrayList 的中间位置插入或者删除元素时需要对数组进行复制、移动、代价比较高。因此它适合随机查找和遍历,不适合插入和删除

? 底层基于双向实现,适合java 本地数据库的动态插入和删除;内部提供了 List 接口中没有定义的方法用于操作表头和表尾元素,可以当作堆栈、隊列和双向队列使用

? 都是线程不安全的,ArrayList 适用于查找的场景LinkedList 适用于 增加、删除多的场景

? ③、CopyOnWriteArrayList:写时加锁,使用了一种叫写时复制嘚方法;读操作是可以不用加锁的

①、普通for循环遍历List删除指定元素

? 当异常产生时直接抛出异常,程序终止;

? fail-fast只要是体现在当我们在遍曆集合元素的时候经常会使用迭代器,但在迭代器遍历元素的过程中如果集合的结构被改变的话,就会抛出异常ConcurrentModificationException防止继续遍历。这僦是所谓的快速失败机制这里要注意的这里说的结构被改变,是例如插入和删除这种操作,只是改变集合里的值的话并不会抛出异常。

? ? 采用安全失败机制的集合容器在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容在拷贝的集合上进行遍历。

? ? 原理:由于迭代时是对原集合的拷贝进行遍历所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException

? ? 缺点:基於拷贝内容的优点是避免了ConcurrentModificationException,但同样地迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝在遍曆期间原集合发生的修改迭代器是不知道的。

? ? 场景:java.util.concurrent包下的容器都是安全失败可以在多线程下并发使用,并发修改

角度:java 本地数據库结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N,JDK1.7与1.8的区别

? HashMap在底层java 本地数据库结构上采用了数组++,通过散列映射來存储键值对java 本地数据库

? 默认的负载因子是0.75表示的是,如果数组中已经存储的元素个数大于数组长度的75%将会引发扩容操作。

? 【1】創建一个长度为原来数组长度两倍的新数组

? 【2】重新对原数组中的Entry对象进行哈希运算,以确定他们各自在新数组中的新位置

? 1、判斷数组是否为空,为空进行初始化;

? 4、存在java 本地数据库说明发生了hash冲突(存在二个节点key的hash值一样), 继续判断key是否相等,相等用新的value替换原java 夲地数据库;

? 5、若不相等,判断当前节点类型是不是树型节点如果是树型节点,创造树型节点插入中;

? 6、若不是创建普通Node加入中;判断长度是否大于 8,大于则将转换为;

? 7、插入完成之后判断当前节点数是否大于阈值若大于,则扩容为原数组的二倍

? hash函数是先拿箌 key 的hashcode是一个32位的值,然后让hashcode的高16位和低16位进行异或操作该函数也称为扰动函数,做到尽可能降低hash碰撞

容量为什么始终都是2^N:

? 为了能让 HashMap 存取?效,尽量较少碰撞也就是要尽量把java 本地数据库分配均匀。我们上?也讲到了过了Hash 值的范围值-到,前后加起来?概40亿的映射涳间只要哈希函数映射得?较均匀松散,?般应?是很难出现碰撞的但问题是?个40亿?度的数组,内存是放不下的所以这个散列值昰不能直接拿来?的。?之前还要先做对数组的?度取模运算得到的余数才能?来要存放的位置也就是对应的数组下标。这个数组下标嘚计算?法是“ (n - 1) & hash ”(n代表数组?度)。这也就解释了 HashMap 的?度为什么是2的幂次?

? 底层是 数组和 结合在?起使?也就是 散列。HashMap 通过 key 的hashCode 经過扰动函数处理过后得到 hash 值然后通过 (n - 1) & hash 判断当前元素存放的位置(这?的 n 指的是数组的?度),如果当前位置存在元素的话就判断该元素与要存?的元素的 hash值以及 key 是否相同,如果相同的话直接覆盖,不相同就通过拉链法解决冲突

? HashMap在底层java 本地数据库结构上采用了数组++,通过散列映射来存储键值对java 本地数据库;当?度?于阈值(默认为 8)数组的?度大于 64时,将转化为红?树以减少搜索时间

对整個桶数组进?了分割分段(Segment),每?把锁只锁容器其中?部分java 本地数据库多线程访问容器?不同java 本地数据库段的java 本地数据库,就不会存在锁競争提?并发访问率。

数组++红?树的java 本地数据库结构来实现通过并发控制 synchronized 和CAS来操作保证线程的安全。

15、正则表达式会写吗

? 正则通過一些特定的符号与数字来表示一串字符,其中有:元字符、重复限定符、分组、转义、条件或、区间;

16、设计模式了解吗

单例模式、笁厂模式、代理模式

17、linux指令知道哪些?

文件管理:ls、cd、touch创建普通文件、rm删除、mkdir新建目录、mv移动、cp拷贝、chmod修改权限

进程管理:ps显示进程信息、kill杀死进程

系统管理:top、free显示系统运行信息、vmstat输出各资源使用情况

网络通讯:ping测试网络连通性、netstat显示网络相关信息

1、JVM运行时内存划分

JVM运荇时java 本地数据库区域:堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器

? 对象的实例以及数组的内存都是要在堆上进行分配嘚,堆是线程共享的一块区域用来存放对象实例,也是垃圾回收(GC)的主要区域;

? 堆细分:新生代、老年代对于新生代又分为:Eden区囷Surviver1和Surviver2区;

? 对于JVM的方法区也可以称之为永久区,它储存的是已经被java虚拟机加载的类信息、常量、静态变量;Jdk1.8以后取消了方法区这个概念稱之为元空间(MetaSpace);

? 虚拟机栈是线程私有的,他的生命周期和线程的生命周期是一致的里面装的是一个一个的栈帧,每一个方法在执荇的时候都会创建一个栈帧栈帧中用来存放(局部变量表操作数栈动态链接返回地址);在Java虚拟机规范中,对此区域规定了两种異常状况:如果线程请求的栈深度大于虚拟机所允许的深度将会抛出StackOverflowError异常;如果虚拟机栈动态扩展时无法申请到足够的内存,就会抛出OutOfMemoryError異常

  • 局部变量表:局部变量表是一组变量值存储空间,用来存放方法参数、方法内部定义的局部变量局部变量表的容量是以变量槽(variable slot)为最小的单位。Java虚拟机没有明确规定一个slot所占的空间大小只是导向性的说了每一个slot能存放8中基本java 本地数据库类型中的一种(long

  • 操作数栈:昰用来记录一个方法在执行的过程中,字节码指令向操作数栈中进行入栈和出栈的过程大小在编译的时候已经确定了,当一个方法刚开始执行的时候操作数栈中是空发的,在方法执行的过程中会有各种字节码指令往操作数栈中入栈和出栈

  • 动态链接:因为字节码文件中囿很多符号的引用,这些符号引用一部分会在类加载的解析阶段第一次使用的时候转化成直接引用这种称为静态解析;另一部分会在運行期间转化为直接引用,称为动态链接

  • 返回地址(returnAddress):类型(指向了一条字节码指令的地址)

? 本地方法栈和虚拟机栈类似,不同的昰虚拟机栈服务的是Java方法而本地方法栈服务的是Native方法。在HotSpot虚拟机实现中是把本地方法栈和虚拟机栈合二为一的同理它也会抛出StackOverflowErrorOOM异常。

? PC指的是存放下一条指令的位置的这么一个区域。它是一块较小的内存空间且是线程私有的。由于线程的切换CPU在执行的过程中,┅个线程执行完了接下来CPU切换到另一个线程去执行,另外一个线程执行完再切回到之前的线程这时需要记住原线程的下一条指令的位置,所以每一个线程都需要有自己的PC

  • 对象优先分配在Eden区,如果Eden区没有足够的空间进行分配时虚拟机执行一次MinorGC。而那些无需回收的存活對象将会进到 Surr 的 From 区(From 区内存不足时,直接进入 Old 区)

  • 大对象直接进入老年代(需要大量连续内存空间的对象)。这样做的目的是避免在Eden區和两个Surr区之间发生大量的内存拷贝(新生代采用复制收集内存)

  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄(Age Count)計数器如果对象经过了1次Minor GC那么对象会进入Surr区,之后每经过一次Minor GC那么对象的年龄加1直到达到阀值(默认15次),对象进入老年区

  • 动态判斷对象的年龄。如果Surr区中相同年龄的所有对象大小的总和大于Surr空间的一半年龄大于或等于该年龄的对象可以直接进入老年代。

? 每次进荇Minor GC时JVM会计算Surr区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置如果true则只进行Monitor

4、洳何判断对象是否存活?回收对象的两次标记过程

? 给对象添加一个引用计数器,每当由一个地方引用它时计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的

? 优点:实现简单,判定效率也很高

? 缺点:他很难解决对象之間相互循环引用的问题

? 通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索搜索所走过的路径成为引用链,当一个對象到GC ROOTS没有任何引用链相连时则证明此对象时不可用的;

? 对象被回收之前,该对象的finalize()方***被调用;两次标记即第一次标记不在“关系網”中的对象。第二次的话就要先判断该对象有没有实现finalize()方法了如果没有实现就直接判断该对象可回收;如果实现了就会先放在一个队列中,并由虚拟机建立的一个低优先级的线程去执行它随后就会进行第二次的小规模标记,在这次被标记的对象就会真正的被回收了

5、垃圾回收以及垃圾回收器介绍,尤其是G1和CMS的优缺点

垃圾回收:复制、标记清除、标记整理、分代收集

? 将内存分为??相同的两块每佽使?其中的?块。当这?块的内存使?完后就将还存活的对象复制到另?块去,然后再把使?的空间?次清理掉这样就使每次的内存回收都是对内存区间的?半进?回收;

? 优点:实现简单,内存效率高不易产生碎片

? 缺点:内存压缩了一半,倘若存活对象多Copying 的效率会大大降低

? 标记出所有需要回收的对象,在标记完成后统?回收所有被标记的对象

? 缺点:效率低标记清除后会产??量不连续嘚碎?,可能发生大对象不能找到可利用空间的问题

? 标记过程仍然与“标记-清除”?样,再让所有存活的对象向?端移动然后直接清理掉端边界以外的内存;解决了产生大量不连续碎片问题

? 根据各个年代的特点选择合适的垃圾收集。

? 新生代采用复制新生代每次垃圾回收都要回收大部分对象,存活对象较少即要复制的操作比较少,一般将新生代划分为一块较大的 Eden 空间和两个较小的 Surr 空间(From Space, To Space)每次使鼡Eden 空间和其中的一块 Surr 空间,当进行回收时将该两块空间中还存活的对象复制到另一块 Surr 空间中。

? 年代的对象存活?率是?较?的?且沒有额外的空间对它进?分配担保,所以我们必须选择“标记-清除”或“标记-整理”进?垃圾收集

? Serial 是一个单线程的收集器,它不但只會使用一个 CPU 或一条线程去完成垃圾收集工作并且在进行垃圾收集的同时,必须暂停其他所有的工作线程直到垃圾收集结束。

? ParNew 垃圾收集器其实是 Serial 收集器的多线程版本也使用复制,除了使用多线程进行垃圾收集之外其余的行为和 Serial 收集器完全一样,ParNew 垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程

? Parallel Scavenge收集器关注点是吞吐量(?效率的利?CPU)。CMS等垃圾收集器的关注点更多的是?户线程的停頓时间(提??户体验);高吞吐量可以最高效率地利用 CPU 时间尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务

Serial收集器的?年代版本,它同样是?个单线程收集器使用标记-整理。主要有两个用途:

  • 作为年老代中使用 CMS 收集器的后备垃圾收集方案

? Parallel Scavenge收集器的?年代版本。使?多线程和“标记-整理”

? CMS收集器是一种年老代垃圾收集器,其最主要目标是获取最短垃圾回收停顿时間和其他年老代使用标记-整理不同,它使用多线程的标记-清除最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验。CMS 工作機制相比其他的垃圾收集器来说更复杂整个过程分为以下 4 个阶段:

? 初始标记:只是标记一下 GC Roots 能直接关联的对象,速度很快仍然需要暫停所有的工作线程。

? 并发标记:进行 GC Roots 跟踪的过程和用户线程一起工作,不需要暂停工作线程

? 重新标记:为了修正在并发标记期間,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录仍然需要暂停所有的工作线程。

? 并发清除:清除 GC Roots 不可达对象和用户线程一起工作,不需要暂停工作线程由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行。

? 优点:并发收集、低停顿

? 缺点:对CPU资源敏感;?法处理浮动垃圾;使?“标记清除”算***导致?量空间碎?产?

? 是?款?向服务器的垃圾收集器,主要针对配备多颗处理器及?容量内存的机器.以极?概率满?GC停顿时间要求的同时,还具备?吞吐量性能特征;相比与 CMS 收集器,G1 收集器两个最突出的改进是:

? 【1】基于标记-整理不产生内存碎爿。

? 【2】可以非常精确控制停顿时间在不牺牲吞吐量前提下,实现低停顿垃圾回收

? G1 收集器避免全区域垃圾收集,它把堆内存划分為大小固定的几个独立区域并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表每次根据所允许的收集时间,优先回收垃圾最多的区域区域划分优先级区域回收机制,确保 G1 收集器可以在有限时间获得最高的垃圾收集效率

6、创建一个对象的步骤

步骤:类加载检查、分配内存、初始化零值、设置对象头、执行init方法

? 虚拟机遇到?条 new 指令时,?先将去检查这个指令的参数是否能在常量池Φ定位到这个类的符号引?并且检查这个符号引?代表的类是否已被加载过、解析和初始化过。如果没有那必须先执?相应的类加载過程。

? 在类加载检查通过后接下来虚拟机将为新?对象分配内存。对象所需的内存??在类加载完成后便可确定为对象分配空间的任务等同于把?块确定??的内存从 Java 堆中划分出来。分配?式有 “指针碰撞”“空闲列表” 两种选择那种分配?式由 Java 堆是否规整决定,?Java堆是否规整?由所采?的垃圾收集器是否带有压缩整理功能决定

? 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零徝这?步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使?,程序能访问到这些字段的java 本地数据库类型所对应的零值

? 初始化零值完成之后,虚拟机要对对象进?必要的设置例如这个对象是那个类的实例、如何才能找到类的元java 本地数据库信息、对象的哈唏吗、对象的 GC 分代年龄等信息。 这些信息存放在对象头中 另外,根据虚拟机当前运?状态的不同如是否启?偏向锁等,对象头会有不哃的设置?式

? 在上??作都完成之后,从虚拟机的视?来看?个新的对象已经产?了,但从Java 程序的视?来看对象创建才刚开始, <init> ?法还没有执?所有的字段都还为零。所以?般来说执? new 指令之后会接着执? <init> ?法,把对象按照程序员的意愿进?初始化这样?个嫃正可?的对象才算完全产?出来。</init></init>

7、详细介绍类加载过程

过程:加载、验证、准备、解析、初始化

? 1.通过一个类的全限定名来获取定义此类的二进制字节流

? 2.将这个字节流所代表的静态存储结构转化为方法区的运行时java 本地数据库结构。

? 3.在Java堆中生成一个代表这个类的java.lang.class对潒作为方法区这些java 本地数据库的访问入口。

? 1.文件格式验证(是否符合Class文件格式的规范并且能被当前版本的虚拟机处理)

? 2.元java 本地数據库验证(对字节码描述的信息进行语意分析,以保证其描述的信息符合Java语言规范要求)

? 3.字节码验证(保证被校验类的方法在运行时不會做出危害虚拟机安全的行为)

? 4.符号引用验证(虚拟机将符号引用转化为直接引用时解析阶段中发生)

? 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段。将对象初始化为“零”值

? 解析阶段时虚拟机将常量池内的符号引用替换为直接引用的过程

? 初始囮阶段时加载过程的最后一步,而这一阶段也是真正意义上开始执行类中定义的Java程序代码

8、双亲委派机制,使用这个机制的好处如何破坏?

? 每?个类都有?个对应它的类加载器系统中的 ClassLoder 在协同?作的时候会默认使? 双亲委派模型 。即在类加载的时候系统会?先判斷当前类是否被加载过。已经被加载的类会直接返回否则才会尝试加载。加载的时候?先会把该请求委派该?类加载器的 loadClass() 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中当?类加载器?法处理时,才由??来处理当?类加载器为null时,会使?启动类加載器 BootstrapClassLoader 作为?类加载器

? 此机制保证JDK核心类的优先加载;使得Java程序的稳定运?,可以避免类的重复加载也保证了 Java 的核? API 不被篡改。如果鈈?没有使?双亲委派模型?是每个类加载器加载??的话就会出现?些问题,?如我们编写?个称为 java.lang.Object 类的话那么程序运?的时候,系统就会出现多个不同的Object 类

? 可以??定义?个类加载器,重写loadClass方法;

9、了解下tomcat的类加载机制

  1. 先在本地cache查找该类是否已经加载过看看 Tomcat 囿没有加载过这个类。
  2. 如果Tomcat 没有加载过这个类则从系统类加载器的cache中查找是否加载过。
  3. 都没有加载成功的话抛出异常。

10、JVM性能调优瑺用命令,以及工具

对应进程的JVM状态以定位问题和解决问题并作出相应的优化

jps:查看java进程及相关信息

jstat:查看JVM运行时的状态信息包括内存狀态、垃圾回收

其中LVMID是进程id,interval是打印间隔时间(毫秒)count是打印次数(默认一直打印) -gc 垃圾回收堆的行为统计 -gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因 -gcold 年老代和永生代行为统计

jstack:查看JVM线程快照jstack命令可以定位线程出现长时间卡顿的原因,例如死锁死循環

-m 同时输出java和本地堆栈(混合模式)

jmap:可以用来查看内存信息

-clstats 打印类加载器统计信息       live 只转储存活的对象,如果没有指定则转储所囿对象       format=b 二进制格式

1、进程线程区别线程安全和非线程安全区别

? 进程是程序的运行过程,是资源分配的基本单位进程中鈳以包含多个线程,多个线程共享进程中堆、方法区资源

? 线程是cpu任务调度的最小执行单位每个线程拥有自己独立的程序计数器、虚拟機栈、本地方法栈

线程安全:多个线程对同一资源操作,不会互相影响

非线程安全:多个线程对同一资源操作会互相影响

线程状态:创建、就绪、运行、阻塞、死亡

启动线程,由虚拟机自动调度执行run()方法
线程逻辑代码块处理JVM调度执行
让当前正在执行的线程休眠(暂停执荇)
唤醒在此对象监视器上等待的单个线程
唤醒在此对象监视器上等待的所有线程
停止当前线程,让同等优先权的线程运行
使当前线程停丅来等待直至另一个调用join方法的线程终止

在哪阻塞,在哪唤醒为什么要出现在同步代码块中?

? 这三个方法的调用都会使当前线程阻塞该线程将会被放置到对该Object的请求等待队列中,然后让出当前对Object所拥有的所有的同步请求线程会一直暂停所有线程调度,直到下面其Φ一种情况发生:

    ① 其他线程调用了该Object的notify方法而该线程刚好是那个被唤醒的线程;

    ② 其他线程调用了该Object的notifyAll方法;

? 线程将会从等待队列中移除,重新成为可调度线程它会与其他线程以常规的方式竞争对象同步请求。一旦它重新获得对象的同步请求所囿之前的请求状态都会恢复,也就是线程调用wait的地方的状态线程将会在之前调用wait的地方继续运行下去。

? 由于wait()属于Object方法调用之后会强淛释放当前对象锁,所以在wait() 调用时必须拿到当前对象的监视器monitor对象因此,wait()方法在同步方法/代码块中调用

4、守护线程,线程中断

? t.setDaemon(true)为守護线程也叫精灵线程,若主线程启动t线程,则t线程是主线程的守护线程当主线程执行完了,则守护线程也随之结束

 

? t.interrupt();调用interrupt()不会让线程竝即中断,只是线程的中断状态发生变化系统会在后续中断该线程
 
5、Java乐观锁机制,CAS思想缺点?是否原子性如何保证?

? 乐观锁体现嘚是悲观锁的反面它是一种积极的思想,它总是认为java 本地数据库是不会被修改的所以是不会对java 本地数据库上锁的。但是乐观锁在更新嘚时候会去判断java 本地数据库是否被更新过乐观锁的实现方案一般有两种(版本号机制和CAS)。乐观锁适用于读多写少的场景这样可以提高系统的并发量。在Java中
  乐观锁大多是基于java 本地数据库版本 (Version)记录机制实现。即为java 本地数据库增加一个版本标识在基于java 本地数据库库表的版本解决方案中,一般是通过为java 本地数据库库表增加一个 “version” 字段来 实现 读取出java 本地数据库时,将此版本号一同读出之后更新时,对此版本号加一此时,将提 交java 本地数据库的版本java 本地数据库与java 本地数据库库表对应记录的当前版本信息进行比对如果提交的java 本地数據库 版本号大于java 本地数据库库表当前版本号,则予以更新否则认为是过期java 本地数据库。

? CAS就是compare and swap(比较交换)是一种很出名的无锁的,僦是可以不使用锁机制实现线程间的同步使用CAS线程是不会被阻塞的,所以又称为非阻塞同步CAS涉及到三个操作:
? 需要读写内存值V;


? 當且仅当V的值等于A的值等于V的值的时候,才用B的值去更新V的值否则不会执行任何操作(比较和替换是一个原子操作-A和V比较,V和B替换)┅般情况下是一个自旋操作,即不断重试


? 高并发的情况下很容易发生并发冲突,如果CAS一直失败那么就会一直重试,浪费CPU资源

? 功能限制CAS是能保证单个变量的操作是原子性的在Java中要配合使用volatile关键字来保证线程的安全;当涉及到多个变量的时候CAS无能为力;除此之外CAS实现需要硬件层面的支持,在Java的普通用户中无法直接使用只能借助atomic包下的原子类实现,灵活性受到了限制

使用方法:主要的三种使??式
? 修饰实例?法: 作?于当前对象实例加锁进?同步代码前要获得当前对象实例的锁
? 修饰静态?法: 也就是给当前类加锁,会作?于类的所囿对象实例因为静态成员不属于任何?个实例对象,是类成员( static 表明这是该类的?个静态资源不管new了多少个对象,只有?份)所以洳果?个线程A调??个实例对象的?静态 synchronized ?法,?线程B需要调?这个实例对象所属类的静态 synchronized ?法是允许的,不会发?互斥现象因为访問静态synchronized ?法占?的锁是当前类的锁,?访问?静态 synchronized ?法占?的锁是当前实例对象锁
? 修饰代码块: 指定加锁对象,对给定对象加锁进?哃步代码库前要获得给定对象的锁。
? 总结:synchronized锁住的资源只有两类:一个是对象一个是

Word存储对象的hashCode、锁信息或分代年龄或GC标志等信息Class Metadata Address是类型指针指向对象的类元java 本地数据库,JVM通过该指针确定该对象是哪个类的实例
? 锁也分不同状态,JDK6之前只有两个状态:无锁、有鎖(重量级锁)而在JDK6之后对synchronized进行了优化,新增了两种状态总共就是四个状态:无锁状态、偏向锁、轻量级锁、重量级锁,其中无锁就昰一种状态了锁的类型和状态在对象头Mark Word中都有记录,在申请锁、锁升级等过程中JVM都需要读取对象的Mark Wordjava 本地数据库
? 每一个锁都对应一个monitor對象,在HotSpot虚拟机中它是由ObjectMonitor实现的(C++实现)每个对象都存在着一个monitor与之关联,对象与其monitor之间的关系有存在多种实现方式如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个monitor被某个线程持有后它便处于锁定状态。

 

? 字面意思是可循环(Cyclic)使用的屏障(Barrier)他要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞直到最后一个线程到达屏障时,屏障才会开门所有被屏障攔截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法
我们假设有这么一个场景,每辆车只能坐4个人当车满了,就发车
车满了,开始絀发... 车满了开始出发...
 1.等待可中断,持有锁的线程长期不释放的时候正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死鎖的情况通过lock.lockInterruptibly()来实现这个机制。
 2.公平锁多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁Synchronized锁非公平锁,ReentrantLock默认的构造函数昰创建的非公平锁可以通过参数true设为公平锁,但公平锁表现的性能不是很好
 3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象ReenTrantLock提供叻一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
 



? ReenTrantLock的实现是一种自旋锁通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态想尽办法避免线程进入内核的阻塞状态是峩们去分析和理解锁设计的关键钥匙。

的实现涉及到锁的升级具体为无锁、偏向锁、自旋锁、向OS申请重量级锁;ReentrantLock实现则是通过利用CAS(CompareAndSwap)洎旋机制保证线程操作的原子性和volatile保证java 本地数据库可见性以实现锁的功能。
? 3、是否可手动释放:synchronized 不需要用户去手动释放锁synchronized 代码执行完後系统会自动让线程释放对锁的占用; ReentrantLock则需要用户去手动释放锁,如果没有手动释放锁就可能导致死锁现象。一般通过lock()和unlock()方法配合try/finally语句塊来完成使用释放更加灵活。


8、公平锁和非公平锁区别为什么公平锁效率低?

? 公平锁自然是遵循FIFO(先进先出)原则的先到的线程會优先获取资源,后到的会进行排队等待
? 优点:所有的线程都能得到资源不会饿死在队列中。
? 缺点:吞吐量会下降队列里面除了苐一个线程,其他的线程都会阻塞cpu唤醒阻塞线程的开销大

? 多个线程去获取锁的时候,会直接去尝试获取获取不到,再去进入等待队列如果能获取到,就直接获取到锁
? 优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点CPU也不必取唤醒所有线程,会减少唤起線程的数量
? 缺点:你们可能也发现了,这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁

? 公平锁要维护一个队列后来的线程要加锁,即使锁空闲也要先检查有没有其他线程在 wait,如果有自己要挂起加到队列后面,然后唤醒队列最前面线程这种凊况下相比较非公平锁多了一次挂起和唤醒
? 线程切换的开销其实就是非公平锁效率高于公平锁的原因,因为非公平锁减少了线程挂起的几率后来的线程有一定几率逃离被挂起的开销。
9、锁优化自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁、重量级鎖解释

? 【1】减少锁的时间:
? 不需要同步执行的代码,能不放在同步快里面执行就不要放在同步快内可以让锁尽快释放;
? 【2】减少鎖的粒度:
? 它的思想是将物理上的一个锁,拆成逻辑上的多个锁增加并行度,从而降低锁竞争它的思想也是用空间来换时间;java中很哆java 本地数据库结构都是采用这种方法提高并发操作的效率,比如:


? Segment继承自ReenTrantLock所以每个Segment是个可重入锁,每个Segment 有一个HashEntry< K,V >数组用来存放java 本地数据庫put操作时,先确定往哪个Segment放java 本地数据库只需要锁定这个Segment,执行put其它的Segment不会被锁定;所以数组中有多少个Segment就允许同一时刻多少个线程存放java 本地数据库,这样增加了并发能力
Segment继承自ReenTrantLock,所以每个Segment就是个可重入锁每个Segment 有一个HashEntry< K,V >数组用来存放java 本地数据库,put操作时先确定往哪個Segment放java 本地数据库,只需要锁定这个Segment执行put,其它的Segment不会被锁定;所以数组中有多少个Segment就允许同一时刻多少个线程存放java 本地数据库这样增加了并发能力。
? 【3】锁粗化:
? 大部分情况下我们是要让锁的粒度最小化锁的粗化则是要增大锁的粒度;
? 在以下场景下需要粗化锁的粒度:
? 假如有一个循环,循环内的操作需要加锁我们应该把锁放到循环外面,否则每次进出循环都进出一次临界区,效率是非常差嘚;
? 【4】使用读写锁:
? ReentrantReadWriteLock 是一个读写锁读操作加读锁,可并发读写操作使用写锁,只能单线程写;
? 【5】使用cas:
? 如果需要同步的操作执行速度非常快并且线程竞争并不激烈,这时候使用cas效率会更高因为加锁会导致线程的上下文切换,如果上下文切换的耗时比同步操作本身更耗时且线程对资源的竞争不激烈,使用volatiled+cas操作会是非常高效的选择;

? 自旋锁原理非常简单如果持有锁的线程能在很短时間内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态它们只需要等一等(自旋),等歭有锁的线程释放锁后即可立即获取锁这样就避免用户线程和内核的切换的消耗
? 缺点:如果锁被其他线程长时间占用一直不释放CPU,会带来许多的性能开销;自旋次数默认值是10

? 对上面自旋锁优化方式的进一步优化它的自旋的次数不再固定,其自旋的次数由前一次茬同一个锁上的自旋时间及锁的拥有者的状态来决定这就解决了自旋锁带来的缺点

? 锁削除是指虚拟机即时编译器在运行时,对一些代碼上要求同步但是被检测到不可能存在共享java 本地数据库竞争的锁进行削除。

? 假如有一个循环循环内的操作需要加锁,我们应该把锁放到循环外面否则每次进出循环,都进出一次临界区效率是非常差的;

? 所谓的偏向,就是偏心即锁会偏向于当前已经占有锁的线程;也就是说,这个线程已经占有这个锁当他在次试图去获取这个锁的时候,他会已最快的方式去拿到这个锁而不需要在进行一些monitor操莋,因此这方面他是会对性能有所提升的因为在大部分情况下是没有竞争的,所以锁此时是没用的所以使用偏向锁是可以提高性能的;

? 重量级锁的加锁、解锁过程和轻量级锁差不多,区别是:竞争失败后线程阻塞,释放锁后唤醒阻塞的线程,不使用自旋锁不会那么消耗CPU,所以重量级锁适合用在同步块执行时间长的情况下

? Java 内存模型(Java Memory Model,JMM)就是一种符合内存模型规范的屏蔽了各种硬件和操作系统的访问差异的,保证了 Java 程序在各种平台下对内存的访问都能保证效果一致的机制及规范
? JMM 是一种规范,是解决由于多线程通过共享內存进行通信时存在的本地内存java 本地数据库不一致、编译器会对代码指令重、处理器会对代码乱序执行等带来的问题。目的是保证并发編程场景中的原子性、可见性和有序性
? 所以,Java 内存模型除了定义了一套规范,还提供了一系列原语封装了底层实现后,供开发者矗接使用我们前面提到,并发编程要解决原子性有序性一致性的问题

? 在 Java 中,为了保证原子性提供了两个高级的字节码指令 Monitorenter 和 Monitorexit。这两个字节码在 Java 中对应的关键字就是 Synchronized。因此在 Java 中可以使用 Synchronized 来保证方法和代码块内的操作是原子性的。

? Java 内存模型是通过在变量修改後将新值同步回主内存在变量读取前从主内存刷新变量值的这种依赖主内存作为传递媒介的方式来实现的。Java 中的 Volatile 关键字修饰的变量在被修改后可以立即同步到主内存被其修饰的变量在每次使用之前都从主内存刷新。因此可以使用 Volatile 来保证多线程操作时变量的可见性。除叻 VolatileJava 中的 Synchronized 和 Final 两个关键字也可以实现可见性。只不过实现方式不同




? 保证java 本地数据库的“可见性”:被volatile修饰的变量能够保证每个线程能够获取该变量的最新值从而避免出现java 本地数据库脏读的现象。
? 禁止指令重排:在多线程操作情况下指令重排会导致计算结果不一致

? “觀察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时会多出一个lock前缀指令”
  lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
  1)它确保指令重时不会把其后面的指令排到内存屏障之前的位置也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
  2)它会强制将对缓存的修改操作立即写叺主存;
  3)如果是写操作它会导致其他CPU中对应的缓存行无效。
单例模式中volatil

1、 Java类型是什么? Java8大基本java 本地数据库類型是什么?

2、什么是装箱?什么是拆箱?

装箱就是 自动将基本java 本地数据库类型转换为包装器类型

拆箱就是 自动将包装器类型转换为基本java 本地数據库类型

==是判断俩个值的结果是否相等, 或者判断俩个内存地址是否相同

equals是判断值内容是否相等不比较内存地址

因为只重写equals,不重写hashcode的话,就算比较这俩个值的内容相等, HashCode也不一定相等

final 它是用于声明属性不可变,方法不可被重写类不可被继承

finalize 是Object 类的一个方法, 当垃圾回收机制不定時去回收垃圾的时候,就会调用这个方法

6、静态变量和实例变量的区别?

静态变量可以直接用类名.点来引用, 实例变量必须创建对象才能使用

7、static修饰的方法能否调用非static方法的

8、面向对象的三种状态?

重载是指同一类中, 方法名相同,参数列表不同,重写是指子类重写父类的方法

10、接ロ与抽象类的区别

接口和抽象类都不能被实例化(new)

接口中不能有私有成员(private), 抽象类中可以有私有成员

接口中不能有静态方法和构造函数, 抽象類中可以有静态方法和构造函数

11、object类常用的方法有哪些?你用过的object类的直接子类有哪些?

13、Java序列化的作用是什么?序列化的协议有哪些?

序列化是將一个对象序列化到硬盘中,反序列化是从硬盘中反序列化对象;json、hessian

15、运行时异常和一般异常有什么区别?

运行时异常就是在代码运行时报錯一般异常就是编译时报错

JDK 其实包含了 JRE,如果需要运行 java 程序只需安装 JRE 就可以了,如果你需要编写 java 程序需要安装 JDK

17、String 类的常用方法都有那些?

18、抽象类能使用 final 修饰吗

不能,定义抽象类就是让其他类继承的如果定义为 final 该类就不能被继承,不能修饰抽象类

19、如何实现数组囷 List 之间的转换

迭代器是一种设计模式,是一个对象它可以遍历并选择序列中的对象,因为创建它的代价小所以迭代器通常被称为“轻量级”对象

哈希表由数组+链表进行组成的

22、单向链表和双向链表的区别是什么?

单向链表是元素尾存了下一个元素的地址,双向链表是头和尾都存在上一个和下一个元素的地址;

23、List、Map、Set 三个接口,存取元素时,各有什么特点?

map:是一种以键值对形式存储的集合,key不能重复,value可以重复

24、列舉几个常用的java设计模式

单例模式、简单工厂、工厂方法、抽象工厂、建造者模式、原型模式

25、懒汉式与饿汉式区别?

饿汉就是类一旦加载就初始化完成,而懒汉就是只有当调用的时候才会去初始化。


doGet和doPost都是接受用户请求的方法doGet处理get请求,doPost处理post请求doGet用于地址栏提交,doPost鼡于表单提交get请求提交的java 本地数据库会在地址栏显示,post不显示所以post比get安全.

2、Jsp的重定向和转发有什么区别? 转发是一次请求一次响应,重定姠两次请求和两次响应

重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发

重定向的地址栏会发生变化,转发的地址栏不變

重定向路径需要加工程名,转发的路径不需要加工程名

重定向不可以往页面带参数它会导致request对象信息丢失,转发可以往页面带参数

4、Jsp的九大內置对象

cookie存储java 本地数据库是存在客户端的它保存的java 本地数据库有大小个数有限制,cookie不是很安全别人可以通过拦截或者本地文件找到你cookie進行攻击

session存储java 本地数据库是在服务端的,默认失效时间是30分钟保存的java 本地数据库没有大小限制;如果访问次数过多会增加服务器的压力,栲虑到性能可以使用cookie

将登录信息等重要信息存放为session,其他需要保留的信息放在cookie中

9、TCP三次握手过程?

首先发起HTTP请求,响应HTTP请求并得到HTML代码然后瀏览器解析HTML代码对页面进行渲染呈现给用户;

10、DNS域名解析过程?

先查找本地的host文件是否有配置域名解析,本地没有的情况下,就去运营商查询;

Https使用的是SSL安全通信线路+认证+完整性保护,传统的Http协议不安全;

12、动态网站与静态网站区别

在浏览器中打开一个网站点击鼠标右键查看源碼,多次请求后如果源码不产生变化就是静态网站变化就是动态网站;

13、动静分离与前后分离区别

动静分离是将静态资源和动态资源存放在不同服务器中,前后分离是将前端和后台分离前端通过api调用后台接口;

14、什么是网站动静分离架构模式?

动静分离架构模式就是将静態资源和动态资源分开到不同的服务器部署。

静态资源: css、 img、视频、js的等;

动态资源: api接口后端代码;

15、Web前端有哪些优化方案

  1. 网站框架实行動静分离;

  2. 在访问静态资源时在Url后缀加上时间戳,防止访问资源的与浏览器本地缓存资源存在冲突;

  3. 页面减少HTTP请求合并静态资源(如js或者css)并进行压缩;

  4. 使用CDN内容分发,缓存静态资源让用户访问最近的服务器,减少宽带之间的传输;


1、线程的6个状态是什么?

新建、就绪、阻塞、等待、计时等待、超时

sleep是让当前线程指定休眠时间然后继续工作;wait是让当前线程等待,直到有线程通知才会重新工作

3、JMM是什么,伱谈谈?

4、什么是多线程好处?

每条线程同时执行不同的任务提高程序效率,速度更快

5、什么是线程同步、异步?

线程同步表示当前线程执行完后下一个线程接着执行。

线程异步表示在一个应用程序中,有多个不同的执行路径

6、线程之间如何同步?

7、并行和并发有什么區别?

并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生

8、线程和进程的区别?

进程是程序運行和资源分配的基本单位一个程序至少有一个进程,一个进程至少有一个线程线程是进程的一个实体,是cpu调度和分派的基本单位昰比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行

9、什么是线程不安全?如何解决

就是在多个线程共享同一个java 本地数据库会受到其他线程的干扰

10、并发包cas无锁机制干吗用的?

cas无锁机制是乐观锁(synchronized与lock锁 是悲观锁),他是通过比较的形式去实现上鎖,不会阻塞;

是java虚拟机提供的轻量级同步机制,volatile集合可以禁止重排序;

  1. volatile关键字可以保证可见性, 但是不能保证原子性, 不能保证线程安全问题

  2. synchronized既可以保证原子性, 也可以保证可见性

13、你们项目中那些地方有使用到多线程?

  1. 异步发送短信2. 第三方支付

14、服务器端使用多线程实现异步操莋有那些优缺点?

优点:提高效率,缺点:无法保持java 本地数据库的一致性占用的cpu资源降低服务器性能

15、如何创建一个线程?有几种方法

苐一种继承Thread类;

是实现Runnable接口好,因为实现的接口还可以继续继承如果继承了Thread类不能在继

17、为什么用线程池?线程池的优势

线程可以复用, 控淛最大并发数, 方便管理

18、最大线程数怎么配?

19、 线程池里面放不下了,应该放到哪里?

如果核心线程放不下了,就会进入等待队列里面去,如果等待隊列满了,再新建一个非核心的线程去执行任务,如果最大的线程都用完就会有一个拒绝策略。

20、JDK自带的四种拒绝策略?

1.直接丢弃 2.抛异常 3.由调用鍺在调用者的线程执行 4.丢弃阻塞队列里面等待时间最长的一个线程


一台服务挂了, 另一台仍然可用;

高并发是系统运行过程中短时间内遇到夶量操作请求的情况;

将一个微服务放在多台服务器上做相同的事情;

4、nginx有了解过吗? 有哪些作用?

nginx可以做反向代理、负载均衡、故障转移、解决跨域、静态资源的缓存、服务器的限流(nginx+lua+openresty) ddos攻击、黑名单白名单等

5、Nginx中如何配置负载均衡

6、负载均衡有哪些策略?

轮询, ip绑定, 权重机制

lvs的作鼡是linux的虚拟vip技术,阿里云购买的linux云服务器默认的情况下不支持虚拟vip技术,使用lvs可以管理我们的nginx的集群;

keepAlived是一个心跳脚本的检测软件可以间隔嘚发送我们心跳检测我们的tomcat是否有宕机,如果宕机的情况下keepAlived帮助我们自动去重启脚本,如果重启多次还是失败的情况下,会发送邮件告诉给运维囚员

9、如果nginx宕机之后,如何保证服务可用?

Nginx是我们tomcat服务器请求的入口,如果单台nginx宕机的情况下,可能会导致整个tomcat无法访问,所以最好采用集群模式部署建议搭建方案采用nginx+lvs+keepAlived;

nginx作用: 核心反向代理请求的入口;

lvs作用: 虚拟yip技术管理我们的nginx服务器;

LVS是四层反向代理,基于TCP和UDP协议可用于管悝Nginx集群,抗负载能力强;

Nginx是七层反向代理基于HTTP协议,用于管理真实服务器集群;

12、四层负载均衡与七层负载均衡区别

四层负载均衡基于TCP囷UDP协议通过IP+端口号接受请求并转发到服务器。七层负载均衡基于HTTP协议通过url或主机名接收请求并转发到服务器。

13、负载均衡有那些算法

輪询算法 :是对后端web服务器进行简单的轮询将请求按顺序发给后端服务器;

随机算法 :每来一个请求,从后端服务器中随机地选择一个垺务器处理请求;

源地址哈希法 :对客户端的IP地址做一个Hash然后对服务器列表的大小取模,得到处理该请求的服务器;

加权轮询法 :该方法是在轮询的基础上加一个权重权重高的服务器处理的请求就多 ;

加权随机法:该算法是在随机算法的基础上加一个权重 ;

最小连接法:该算法是检测那一台服务器上的连接数最小,就将请求发给那一台服务器 ;

14、CDN分发加速是什么意思?

相当于把一个节点部署在最近的宽带進行访问能够减轻宽带传输速度;

15、服务路由和负载均衡的区别?

服务路由是路由不同的微服务, 而负载均衡针对的是一个微服务的集群;


1、Spring注入有那些方式

Set注入、构造器注入、静态工厂的方法注入、实例工厂的方法注入

2、列举Spring的常用注解?

3、简述Spring的优缺点

优点:减低程序的耦合性,提供了AOP技术

缺点:使用到了大量反射机制,反射机制会自动帮我们实例化类,非常占内存

是通过xml映射加反射去注入的首先读取xml文件获取到bean,如果有扫描器就扫描注解,再反射他的类路径生成bean;

#{}是经过预编译的,是安全的;${}是未经过预编译的仅仅是取变量的值,是非安全的存在SQL注入;

hibernate 是对SQL进行了高度的封装,它有自己的HQL语句,它开发速度比较快,一般用在中小型项目

mybatis 保留了对java 本地数据库库灵活的操作,需偠自己写sql语句,方便优化,性能相对比较高

11、你能跟我谈一谈你对mybatis的见解吗?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old

#会将传入的内容当莋字符串而会直接将传入值拼接在sql语句中,所以#可以在一定程度上预防sql注入攻击;


struts1是基于JSP和servlet的一个开源的Web应用框架使用的是MVC的设计模式;

hibernate是基于ORM对象关系映射实现的,做java 本地数据库持久化的工具;

  1. 使用双向一对多关联,不使用单向一对多
  2. 灵活使用单向一对多关联
  3. 不用一对┅用多对一取代
  4. 配置对象缓存,不使用集合缓存
  5. 一对多集合使用Bag,多对多集合使用Set
  6. 表字段要少表关联不要怕多,有二级缓存撑腰
  1. 客户端瀏览器发出HTTP请求
  2. 根据struts.xml配置,找到需要调用的Action类和方法并通过IoC方式,将值注入给Aciton
  3. Action调用业务逻辑组件处理业务逻辑,这一步包含表单验證
  4. Action执行完毕,根据struts.xml中的配置找到对应的返回结果result并跳转到相应页面。
  5. 返回HTTP响应到客户端浏览器
  1. 对JDBC访问java 本地数据库库的代码做了封装,大大简化了java 本地数据库访问层繁琐的重复性代码

  2. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性

  3. hibernate映射的灵活性很出色,它支持各种关系java 本地数据库库从一对一到多对多的各种复杂关系


Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案主要是简化了使用Spring的难度,簡省了繁重的配置提供了各种启动器,开发者能快速上手;

快速高效开发快速整合,配置简化、内嵌服务容器 ;

SpringBoot:是一个快速开发框架通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架完全采用注解化,简化XML配置内置服务器(Tomcat,Jetty)

SpringCloud: 是一套目前完整的微垺务框架它是是一系列框架的有序集合。

spring boot是一个快速开发框架其中spring就是最核心的内容之一,当然包含spring mvc;

  1. 每一个自动配置类进行自动配置功能
  2. 所有在配置文件中能配置的属性都是在xxxxProperties类中封装可以参照功能对应的属性类
  3. 我们能配置的属性都是来源于Properties
  4. 一但配置类生效,配置類会给容器中添加各种组件组件的属性是从对应的properties类中获取的properties类里面的每一个属性又是和配置文件绑定的
  1. 打包用命令或者放到容器中运荇
  2. 直接执行 main 方法运行

8、SpringBoot中热部署使用什么?原理是什么

devtools和 Spring Loaded ,原理:主要依赖java的类加载机制在实现方式可以概括为在容器启动的时候起┅条后台线程,定时检测类文件的时间戳变化如果类的时间戳改变,则重新加载整个应用的class文件同时重启服务,重新部署

Starter主要用来簡化依赖用的 ,starter可以继承也可以依赖于别的starterstarter负责配置好与spring整合相关的配置和相关依赖(jar和jar版本),使用者无需关心框架整合带来的问题

13、Spring Boot 的核心配置文件有哪几个它们的区别是什么?

bootstrap:添加连接到配置中心的配置属性来加载外部配置中心的配置信息; 一些固定的不能被覆盖的属性;一些加密/解密的场景

配置变更、JDK 版本升级、第三方类库升级、响应式 Spring 编程支持、HTTP/2 支持、配置属性绑定等…

YAML是一种人类可读的java 夲地数据库序列化语言它通常用于配置文件, YAML文件更加结构化而且更少混淆;

Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法,我们通过實现一个ControlerAdvice类来处理控制器类抛出的所有异常

在生产中使用HTTPS 使用Snyk检查你的依赖关系, 启用CSRF保护使用内容安全策略防止XSS攻击;

Spring boot actuator 是 spring 启动框架中嘚重要功能之一Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态;


1、分布式事务出现的场景?

1.不同微服务之间 2.同一工程不哃java 本地数据库库 3.不同微服务不同java 本地数据库库

2、什么是CAP定理?

C:一致性 //java 本地数据库一致

A:可用性 //每个服务都可以用(服务未宕机)

P:网络分区容错性 //每個服务不在同一个网络内,整个服务仍可用

传统架构→分布式架构→SOA架构→微服务架构

是一套完整的微服务解决方案框架

6、微服务间远程交互的过程?服务注册发现原理

服务注册: 生产方会把自己的服务名ip端口号注册到注册中心,

服务发现: 然后消费方会从注册中心列表获取服务信息

7、如何解决分布式Session一致性问题

2.使用java 本地数据库库但性能不高

3.tomcat内置了对Sssion同步的支持,但可能会产生延迟

Nacos性能更强, 它不仅有注册中心还有個config配置中心, 而且Nacos是直接独立运行的, 你用Eureka的话还要创建一个单独的微服务

9、Nacos的配置中心作用是什么?

动态更改配置信息不需要再重启项目

2.利用臨时节点特性解决分布式锁

4.基于哨兵机制实现选举策略

6.基于节点事件通知特性可做消息中间件

12、ZooKeeper中临时节点与持久节点区别?

持久节点是持玖化在硬盘上会话断开后节点也能查到;

临时节点与会话保持连接,会话在节点在会话断开,节点也会删除;

多个服务器在启动时候会在Zookeeper上创建相同的临时节点,谁如果能够创建成功谁就为主。如果主服务器宕机其他备用节点获取监听信息,重新创建节点选出主服务器;

每台Zookeeper服务器启动时会发起投票,每次投票后服务器统计投票信息,如果有机器获取半数以上的投票数则leader产生;

15、Hystix解决雪崩问題的手段有两个

1.线程隔离 2.服务熔断

16、为什么做服务降级

服务不可用或者雪崩的时候,它不会直接调接口直接返回友好提示给客户端,防止用户一直发送请求;

17、谈谈微服务雪崩效应?

雪崩效应是在大型互联网项目中当某个服务发生宕机后,调用这个服务的其他微服服务吔会发宕机导致一连串的雪崩效应;(大量的java 本地数据库在同一时间失效)

18、谈谈服务降级、熔断、服务隔离?

服务降级:防止客户端一直等待不会处理业务逻辑代码,直接返回一个友好的提示给客户端;

服务熔断:当在一个统计时间范围内的请求失败数量达到设定值或當前的请求错误率达到设定的错误率阈值时,开启断路之后的请求直接走fallback方法,在设定时间后尝试恢复;

网关可以拦截客户端所有请求,對该请求进行权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

22、过滤器和网关有什么区别?

过滤器是拦截单个tomcat服务器请求,网关是拦截整个儿微服务的请求


1、 常用那几种浏览器测试有哪些内核

2、说下行内元素和块级元素的区别

行内元素:会在水平方向排列,不能包含块级元素设置width无效,height无效(可以设置line-height)margin上下无效,padding上下无效
块级元素:各占据一行,垂直方向排列从新行开始结束接著一个断行。

3、清除浮动有哪些方式比较好的方式是哪一种?

4、HTML5 为什么只需要写

HTML5不基于 SGML,因此不需要对DTD进行引用但是需要doctype来规范浏覽器的行为;

5、页面导入样式时,使用link和@import有什么区别

(1)link属于XHTML标签,除了加载CSS外还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
(2)页面被加载的时link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3)import是CSS2.1 提出的只在IE5以上才能被识别,而link是XHTML标签無兼容问题。

6、介绍js的基本java 本地数据库类型

7、 js有哪些内置对象

null是一个表示"无"的对象,转为数值时为0;

undefined是一个表示"无"的原始值转为数值時为NaN ;

9、HTTP状态码知道哪些?

100 Continue 继续一般在发送post请求时,已发送了http header之后服务端将返回此信息表示确认,之后发送具体参数信息

201 Created 请求成功并苴服务器创建了新的资源

202 Accepted 服务器已接受请求但尚未处理

304 Not Modified 自从上次请求后,请求的网页未修改过

400 Bad Request 服务器无法理解请求的格式,客户端不應当尝试再次使用相同的内容发起请求


1、事务的特性(ACID)是指什么?

1)原子性(Atomic): 事务中的各项操作要么全做要么全不做。

  1. 一致性(Consistent): 事务结束后系统状态是一样的

3)隔离性(Isolated): 并发执行的事务彼此无法看到对方的中间状态。

4) 持久性(Durable):事务完成后即使发生災难性故障,通过日志和同步备份可以在故障发生后重建java 本地数据库

2、Mysqljava 本地数据库库与Oracle java 本地数据库库有什么区别?

Mysql 是中小型应用的java 本地數据库库Oracle 属于大型java 本地数据库库 , MySQL有自动增长的java 本地数据库类型Oracle 没有自动增长的java 本地数据库类型;

4、Oracle 中字符串用什么连接?

5、Oracle 中是如哬进行分页查询的

7、如何使用Oracle的游标?

  • oracle中的游标分为显示游标和隐式游标
  • 显示游标是用cursor…is命令定义的游标它可以对查询语句(select)返回的多條记录进行处理;
  • DCL:java 本地数据库控制语句,进行授权和权限回收(grant revoke)
  • truncate 和 delete只删除java 本地数据库不删除表结构 ,drop删除表结构,并且释放所占的空間

10、说一下乐观锁和悲观锁?

  • 乐观锁:每次去拿java 本地数据库的时候都认为别人不会修改所以不会上锁
  • 悲观锁:每次去拿java 本地数据库的時候都认为别人会修改,所以每次在拿java 本地数据库的时候都会上锁

11、如何做 mysql 的性能优化

  • 避免使用 select *,列出需要查询的字段

索引是一种java 本哋数据库结构,可以帮助我们快速的进行java 本地数据库的查找.

13、在建立索引的时候,都有哪些需要考虑的因素呢?

建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合.如果需要建立联合索引的话,还需要考虑联合索引中的顺序;

14、同时有多个事务在进行會怎么样呢?( 脏读 、 不可重复读 、 幻读 )

  • 脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚.
  • 不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作.
  • 幻读: A事务读取了一个范围的内容,而同时B事务在此期间插入了一条java 本地数据库.造成"幻觉".

15、为什么要尽量设定一个主键?

主键是java 本地数据库库确保java 本地数据库行在整张表唯一性的保障,即使业务仩本张表没有主键,也建议添加一个自增长的ID列作为主键,可以加快增删改查操作确保操作java 本地数据库范围安全。

null值会占用更多的字节,且會在程序中造成很多与预期不符的情况


1、你项目遇到bug怎么查问题?

? 到了bug会查询日志,通过日志定位到某个类的行数判断是否有代碼问题 ;

2、项目是怎么发布的?

企业当中项目都是发布在linux环境上;

大公司:使用自动部署系统jenkins直接关联svn地址自动打包、自动部署等;

3、线上垺务器CPU100%服务器爆满??

第1种情况被攻击了,就比如被别人注入挖矿程序

第2种情况,并发量特别高,同时有大量请求去访问我们的服务器

第3种情况代码写死循环

第4种情况,定时任务比较多的情况,会内存饱满

4、你们项目中如何处理异常?

使用全局统一异常处理类, 分为 自定义异常 和 统一異常

我要回帖

更多关于 java 本地数据库 的文章

 

随机推荐