与业务无关,却为业务模块所共同调用的逻辑封装起来的部分。以便于减少系统的重复代码,降低模块间的耦合度,并有利于系统维护。
22、jdk1.5以后出来的并发包了解吗?介绍lock接口的signal与notify区别,wait与await()区别
CyclicBarrier是JDK 5中Java.util.Concurrent包中提出的同步类。CyclicBarrier可以用来等待子任务都完成后执行最后的任务。所有的线程等待其它线程到达Barrier。CyclicBarrier初始化时指定需要等待的线程数,通过调用CyclicBarrier.await()方法,所有线程阻塞等待直到都调用了await()方法。
(1). lock不再用synchronize把同步代码包装起来; (2). 阻塞需要另外一个对象condition;
(3). 同步和唤醒的对象是condition而不是lock,对应的方法是await和signal,而不是wait和notify。
23、如何解决闭环的链表(快慢指针或者mark换效率)
24、生产者消费问题实现
(1)wait() / nofity()方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。
wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。
notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。
(2)在JDK5.0之后,Java提供了更加健壮的线程处理机制,包括同步、锁定、线程池等,它们可以实现更细粒度的线程控制。await()和signal()就是其中用来做同步的两种方法,它们的功能基本上和wait() / nofity()相同,完全可以取代它们,但是它们和新引入的锁定机制Lock直接挂钩,具有更大的灵活性。通过在Lock对象上调用newCondition()方法,将条件变量和一个锁对象进行绑定,进而控制并发程序访问竞争资源的安全。
25、数据结构了解吗?HashMap实现原理?
数据结构主要指逻辑结构和物理结构;数据之间的相互关系称为逻辑结构。通常分为四类基本结构:
集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 结构中的数据元素之间存在一对一的关系。 树型结构 结构中的数据元素之间存在一对多的关系。
图状结构或网状结构 结构中的数据元素之间存在多对多的关系
HashMap结构的实现原理是将put进来的key-value封装成一个Entry对象存储到一个Entry数组中,位置(数组下标)由key的哈希值与数组长度计算而来。如果数组当前下标已有值,则将数组当前下标的值指向新添加的Entry对象。
26、hibernate orm的实现原理(xml解析,反射调用javaBean方法)
在使用它实现ORM功能的时候,主要的文件有:映射类(*.java)、映射文件 (*.hbm.xml)以及数据库配置文件(*.properties或*.cfg.xml),它们各自的 作用如下。
⑴映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性, 将来就可以实现把表中的记录映射成为该类的对象。
⑵映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据 库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对 应关系等。
⑶数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比如连接 哪中数据库、登录用户名、登录密码以及连接字符串等。
27、对http协议了解吗?get,post,put,delete使用场景以及http1.1与1.0区别(长短连接)
http叫超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
GET: 请求指定的页面信息,并返回实体主体。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。 PUT: 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE: 请求服务器删除指定的页面
1,HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,; 2,HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!
28、介绍下你的项目,sql常用的优化技巧(结构优化,索引优化,sql优化)
(1)不要在建立的索引的数据列上进行下列操作: 避免对索引字段进行计算操作
避免在索引字段上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL 避免在索引列上出现数据类型转换 避免在索引字段上使用函数
避免建立索引的列中使用空值 (2)SELECT子句中避免使用’*’ (3)使用表的别名(Alias) (4)ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
29、谈谈你对分布式和cluster的理解
所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
簇(cluster),我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。
30、介绍jvm内存模型和垃圾回收机制(栈帧,堆,方法区,分代回收机制)
JVM内存模型 1. 栈
Java栈是与每个线程关联的, JVM在创建每一个线程的时候, 会分配一定的栈空间给线程. 存储局部变量, 引用, 方法, 返回值等.
StackOverflowError: 如果在线程执行的过程中, 栈空间不够用, 那么JVM就会抛出此异常, 这种情况一般是死递归造成的. 2. 堆
JVM堆一般分为三个部分: (1). Young: 年轻代
Young区被分为三个部分, Eden区和两个大小严格相同的Survivor区,其中Survivor区间中, 某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用, 在Young区间变满的时候, minor GC就会将存活的对象一到空闲的Survivor区间中, 根据JVM的策略, 在经过几次垃圾收集后, 仍然存活于Suvivor的对象被移动到Tenured区间. (2) Tenured: 老年代
Tenured区主要保存生命周期长的对象, 一般是一些老的对象, 当一些对象在Young复制转移一定的次数以后, 对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存, 缓存中的对象往往会被转移到这一区间. (3) Perm 持久代:
Perm代主要保存class, method, filed等对象, 这部分空间一般不会溢出.
Java.lang.OutofMemoryError: PermGen space的错误, 造成这个错误的很大原因就是可能每次都重新部署,但重新部署后, 类的class没有被卸载掉, 这样就造成了大量class对象保存在了perm中, 这种情况下, 一般重新启动应用服务器可以解决问题. 3. 堆的大小 -Xmx:指定JVM堆得最大内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存 -Xms :指定了JVM初始启动以后初始化内存
-Xmx -Xms之差就是三个Virtual空间的总大小(年轻代、年老代、持久代) JVM垃圾回收机制 分代垃圾回收
不同的对象生命周期不同, 与业务信息有关的对象生命周期较长,如Http请求中的Session对象, 线程, socket连接. 程序运行过程中的临时变量生命周期较短,如String对象.
把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。JVM中共划分为三个代:年轻代、年老代和持久代,其中持久代主要存放Java类的类信息,与垃圾收集要收集的Java对象关系不大,年轻代和年老代的划分是对垃圾收集影响较大的。 年轻代: 存放所有新生的对象
年老代: 在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;
持久代: 用于存放静态文件, 如Java类, 方法等, (持久代对垃圾回收没有显著影响, 但是有些应用可能动态生成或者调用一些class,例如Hibernate等, 在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类)
新生代的垃圾收集器命名为\老生代的GC命名为\或 \其中用System.gc()强制执行的是Full GC.
31、对CMS回收了解吗?
CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。
32、String的引用在哪里,对象在哪里
在java中引用也是对象。
(1)堆栈:一般存储引用和基本类型变量,堆栈主要是通过堆栈指针上下移动来对内存进行分配和释放。
基本类型变量并不适应于new进行创建,因为其所占的内存较小。
(2)堆:用于存储java对象,当程序执行new的时候,堆就会分配一个空间给这个对象,记住堆进行内存的分配和释放是比堆栈进行存储和释放内存消耗更多的时间,这就是基本类型变量要存在堆栈中了,因为基本类型变量是用的最频繁的,频繁的存储和释放内存,在消耗更多的时候,性能可想而知的
33、说说redis的数据类型(String list set lset)
(1)全局key操作 (2)String(字符串) (3)Hashes类型:(map) (4)List类型 (5)set类型
(6)Sorted-Sets类型
34、为什么要使用缓存?
缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏。
35、在实际项目中如何解决并发问题,并发和并行的区别?
大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。HTML静态化、图片服务器分离、数据库集群、库表散列、缓存、镜像、负载均衡、CDN加速技术。
并发与并行是两个既相似而又不相同的概念:并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
36、运行时异常和一般异常有何异同
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。checked 异常。对于后者这种异常,JAVA要求程序员对其进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
37、Jdk1.6 1.7 1.8 版本之间有何不同
(1)jdk1.8广义上来说,可以说是1.7的增强版,即1.8的功能更加强大,如:1.8中Switch语句支持string类型 、 Try-with-resource语句 、5 数字类型的下划线表示 更友好的表示方式、在可变参数方法中传递非具体化参数,改进编译警告和错误 ;这个太多了,
(2) 需要注意的是,你用1.8版本开发的程序如果换到其余的1.7版本下可能会报错,即无法运行,而1.7版本下开发的程序,在1.8版本下应该可以正常的运行。 因为版本是自上而下兼容,而自下而上,可能会出问题
(3)所以建议在真正的开发过程中建议使用1.6或1.7版本(1.8还不是很普遍)
38、Oracle中有下列哪几种文件?
A.数据文件 B.日志文件 C.归档日志文件
D.控制文件
(1)数据文件:数据库中的数据在物理上都保存在一些操作系统文件中,这些操作系统的文件就是数据文件,通常是后缀名为.dbf的文件。
(2)控制文件:每个Oracle数据库都有相应的控制文件,是一个二进制文件,它定义了数