JAVA面试题
一、JavaSE编程基础
StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:如果要操作少量的数据用 = String,单线程操作字符串缓冲区 下操作大量数据 = StringBuilder,多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
12.自动装箱与拆箱
a、装箱:将基本类型用它们对应的引用类型包装起来; b、拆箱:将包装类型转换为基本数据类型;
13.int 和 Integer 有什么区别
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
14.Java 为每个原始类型提供了哪些包装类型:
原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
15.ArrayList、LinkedList、Vector 的区别。
ArrayList,Vector 底层是由数组实现,LinkedList 底层是由双线链表实现,从底层的实现可以得出它们的性能问题, ArrayList,Vector 插入速度相对较慢,查询速度相对较快,而LinkedList 插入速度较快,而查询速度较慢。再者由于 Vevtor 使用了线程安全锁,所以ArrayList 的运行效率高于 Vector。
16.HashMap 和 Hashtable 的区别
a、线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
b、效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
c、对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
d、初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了 容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂作为哈希表的大小
e、底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
17.Synchronized 用 过 吗 , 其 原 理 是 什 么 ?
Synchronized 是 由 JVM 实 现 的 一 种 实 现 互 斥 同 步 的 一 种 方 式 , 如 果你 查 看 被 Synchronized 修 饰 过 的 程 序块 编 译 后 的 字 节 码 , 会 发 现 ,被 Synchronized 修 饰 过 的 程 序 块 , 在 编 译 前 后 被 编 译 器 生 成 了monitorenter 和 monitorexit 两 个 字 节 码 指 令 。这 两 个 指 令 是 什 么 意 思 呢 ?在 虚 拟 机 执 行 到 monitorenter 指 令 时 , 首 先 要 尝 试 获 取 对 象 的 锁 :如 果 这 个 对 象 没 有 锁 定 , 或 者 当 前 线 程 已 经 拥 有 了 这 个 对 象 的锁 , 把 锁的 计 数 器 +1; 当 执 行 monitorexit 指 令 时 将 锁 计 数 器 -1; 当 计 数 器为 0 时 , 锁 就 被 释 放 了 。如果 获 取 对 象 失 败 了 , 那 当 前 线 程 就 要 阻 塞 等 待 , 直 到 对 象 锁 被 另 外 一个 线 程 释 放 为 止 。Java 中Synchronize 通 过 在 对 象 头 设 置 标 记 , 达 到 了 获 取 锁 和 释 放锁 的 目 的 。
18.为 什 么 说 Synchronized 是 非 公 平 锁 ?
非 公 平 主 要 表 现 在 获 取 锁 的 行 为 上 , 并 非 是 按 照 申 请 锁 的 时 间 前 后 给 等待 线 程 分 配 锁 的 , 每 当 锁 被释 放 后 , 任 何 一 个 线 程 都 有 机 会 竞 争 到 锁 ,这 样 做 的 目 的 是 为 了 提 高 执 行 性 能 , 缺 点 是 可 能 会 产 生线 程 饥 饿 现 象 。
19.为 什 么 说 Synchronized 是 一 个 悲 观 锁 ? 乐 观 锁 的 实 现 原 理又 是 什 么 ? 什 么 是 CAS, 它 有 什 么 特 性 ?
Synchronized 显 然 是 一 个 悲 观 锁 , 因 为 它 的 并 发 策 略 是 悲 观 的 :不 管 是 否 会 产 生 竞 争 , 任 何 的 数 据 操作 都 必 须 要 加 锁 、 用 户 态 核 心 态 转换 、 维 护 锁 计 数 器 和 检 查 是 否 有 被 阻 塞 的 线 程 需 要 被 唤 醒 等 操 作
。随 着 硬 件 指 令 集 的 发 展 , 我 们 可 以 使 用 基 于 冲 突 检 测 的 乐 观 并 发 策 略 。先 进 行 操 作 , 如 果 没 有 其他 线 程 征 用 数 据 , 那 操 作 就 成 功 了 ;如 果 共 享 数 据 有 征 用 , 产 生 了 冲 突 , 那 就 再 进 行 其 他 的 补 偿 措施 。 这 种乐 观 的 并 发 策 略 的 许 多 实 现 不 需 要 线 程 挂 起 , 所 以 被 称 为 非 阻 塞 同 步 。乐 观 锁 的 核 心 算 法是 CAS( Compareand Swap, 比 较 并 交 换 ) , 它 涉及 到 三 个 操 作 数 : 内 存 值 、 预 期 值 、 新 值 。 当 且 仅 当预 期 值 和 内 存 值 相等 时 才 将 内 存 值 修 改 为 新 值 。这 样 处 理 的 逻 辑 是 , 首 先 检 查 某 块 内 存 的 值 是 否 跟之 前 我 读 取 时 的 一样 , 如 不 一 样 则 表 示 期 间 此 内 存 值 已 经 被 别 的 线 程 更 改 过 , 舍 弃 本 次 操作 , 否 则说 明 期 间 没 有 其 他 线 程 对 此 内 存 值 操 作 , 可 以 把 新 值 设 置 给 此块 内 存 。CAS 具 有 原 子 性 , 它 的 原 子 性由 CPU 硬 件 指 令 实 现 保 证 , 即 使 用JNI 调 用 Native 方 法 调 用 由 C++ 编 写 的 硬 件 级 别 指 令 , JDK 中 提供 了Unsafe 类 执 行 这 些 操 作 。
20.乐 观 锁 一 定 就 是 好 的 吗 ?
乐 观 锁 避 免 了 悲 观 锁 独 占 对 象 的 现 象 , 同 时 也 提 高 了 并 发 性 能 , 但 它 也有 缺 点 :
a、乐 观 锁 只 能 保 证 一 个 共 享 变 量 的 原 子 操 作 。 如 果 多 一 个 或 几 个 变 量 , 乐观 锁 将 变 得 力 不 从 心 , 但互 斥 锁 能 轻 易 解 决 , 不 管 对 象 数 量 多 少 及 对 象颗 粒 度 大 小 。
b、长 时 间 自 旋 可 能 导 致 开 销 大 。 假 如 CAS 长 时 间 不 成 功 而 一 直 自 旋 , 会给 CPU 带 来 很 大 的 开 销 。
c、ABA 问 题 。 CAS 的 核 心 思 想 是 通 过 比 对 内 存 值 与 预 期 值 是 否 一 样 而 判断 内 存 值 是 否 被 改 过 , 但 这个 判 断 逻 辑 不 严 谨 , 假 如 内 存 值 原 来 是 A,后 来 被 一 条 线 程 改 为 B, 最 后 又 被 改 成 了 A, 则 CAS 认 为 此内 存 值 并没 有 发 生 改 变 , 但 实 际 上 是 有 被 其 他 线 程 改 过 的 , 这 种 情 况 对 依 赖 过 程值 的 情 景 的 运 算 结果 影 响 很 大 。 解 决 的 思 路 是 引 入 版 本 号 , 每 次 变 量 更新 都 把 版 本 号 加 一 。
二、JDBC技术
3.execute,executeQuery,executeUpdate的区别是什么?
a、Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。
b、Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的 话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。
c、Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句。
d、只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。
4.JDBC的PreparedStatement是什么?
PreparedStatement对象代表的是一个预编译的SQL语句。用它提供的setter方法可以传入查询的变量。由于PreparedStatement是预编译的,通过它可以将对应的SQL语句高效的执行多次。由于PreparedStatement自动对特殊字符转义, 避免了SQL注入攻击,因此应当尽量的使用它。
5.相对于Statement,PreparedStatement的优点是什么?
a、PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义。 b、PreparedStatement可以用来进行动态查询。
c、PreparedStatement执行更快。尤其当你重用它或者使用它的拼量查询接口执行多条语句时。
d、使用PreparedStatement的setter方法更容易写出面向对象的代码,而Statement的话,我们得拼接字符串来生成查询语句。 如果参数太多了,字符串拼接看起来会非常丑陋并且容易出错。
6.JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。ResultSet对象维护了一个游标,指向当前的数据 行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了, next()方法会返回false。可以在for循环中用它来遍历数据集。
7.java.util.Date和java.sql.Date有什么区别?
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库 里,可以考虑使用Timestamp或者DateTime字段。
8.说说事务的概念,在JDBC编程中处理事务的步骤。
事务是作为单个逻辑工作单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性
(ACID) 属性,只有这样才能成为一个事务 。JDBC处理事务有如下操作:
conn.setAutoComit(false);设置提交方式为手工提交conn.commit()提交事务
conn.rollback(),回滚
提交与回滚只选择一个执行。正常情况下提交事务,如果出现异常,则回滚。
9.数据库连接池的原理。为什么要使用连接池。
数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序 的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释 放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对 数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了 这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
10.什么是JDBC的最佳实践?
a、数据库资源是非常昂贵的,用完了应该尽快关闭它。Connection, Statement, ResultSet等JDBC对象都有close方法,调用它就好了。
b、养成在代码中显式关闭掉ResultSet,Statement,Connection的习惯,如果你用的是连接池的话,连接用完后会放回池里, 但是没有关闭的ResultSet和Statement就会造成资源泄漏了。
c、在finally块中关闭资源,保证即便出了异常也能正常关闭。
d、尽量使用PreparedStatement而不是Statement,以避免SQL注入,同时还能通过预编译和缓存机制提升执行的效率。 e、数据库隔离级别越高性能越差,确保你的数据库连接设置的隔离级别是最优的。
f、如果在WEB程序中创建数据库连接,最好通过JNDI使用JDBC的数据源,这样可以对连接进行重用。
三、Mysql数据库技术
类型名称 说明
int(integer) 整数类型
double 小数类型
decimal(m,d) 指定整数位与小数位长度的小数类型
date 日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒
datetime 日期类型,格式为yyyy-MM-dd HH:mm:ss,包含年月日时分秒
timestamp 日期类型,时间戳
varchar(M) 文本类型,M为0~65535之间的整数
7.Student学生表(学号,姓名、性别、年龄、组织部门),Course 课程表(编号,课程名称),Sc选课表(学号,课程编号,成绩)
a、写一个SQL语句,查询选修了计算机原理的学生学号和姓名
select 学号,姓名 from Student where 学号 in(select 学号 from Sc where 课程编号 in(Select 课程编号 from Course where 课程名称 = ‘计算机原理’))
b、写一个SQL语句,查询“周星驰”同学选修了的课程名字
select 课程名称 from Course where 编号 in (select Sc.课程编号 from Student,Sc where Student.姓名=’周星驰’ and Student.学号 = Sc.学号)
8.表结构说明
下面是学生表的(Student)的结构说明
字段名称 字段解释 字段类型 字段长度 约束
s_id 学号 字符 10 PK
s_name 学生姓名 字符 50 Not null
s_age 学生年龄 数值 3 Not null
s-sex 学生性别 字符(男:1女:0) 1 Not null
下面是教师表(Teacher )的结构说明
字段名称 字段解释 字段类型 字段长度 约束
t_id 教师编号 字符 10 PK
t_name 教师名字 字符 50 Not null
下面是课程表(Course)的结构说明
字段名称 字段解释 字段类型 字段长度 约束
c_id 课程编号 字符 10 PK
c_name 课程名字 字符 50 Not null
t_id 教师编号 字符 10 Not null
下面是成绩表(SC)的结构说明
字段名称 字段解释 字段类型 字段长度 约束
s_id 学号 字符 10 PK
c_id 课程编号 字符 10 Not null
score 成绩 数值 3 Not null
9.查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.s_id from (select s_id,score from SC where C_ID=‘001’) a,(select s_id,scorefrom SC where C_ID=‘002’) b where a.score>b.score and a.s_id=b.s_id;
10.查询平均成绩大于60分的同学的学号和平均成绩;
select S_ID,avg(score) from sc group by S_ID having avg(score) >60;
11.查询所有同学的学号、姓名、选课数、总成绩;
select Student.S_ID,Student.Sname,count(SC.C_ID),sum(score) from Student left Outer join SC on Student.S_ID=SC.S_ID group by Student.S_ID,Sname
12.查询姓“李”的老师的个数;
select count(distinct(Tname)) from Teacher where Tname like ‘李%’;
13.查询所有课程成绩小于60分的同学的学号、姓名;
select S_ID,Sname from Student where S_ID not in (select S.S_ID from Student AS S,SC where S.S_ID=SC.S_ID and score>60);
14.查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select distinct S_ID,Sname from Student,SC where Student.S_ID=SC.S_ID and SC.C_ID in (select C_ID from SC where S_ID=‘1001’);
四、JavaScript语言和jQuery技术(异步同步请求)
JS中如何将页面重定向到另一个页面?
a、使用 location.href:window.location.href =“https://www.baidu.com/”
b、使用location.replace:window.location.replace(" https://www.baidu.com/;");
undefined,null 和 undeclared 有什么区别?
a、null表示"没有对象",即该处不应该有值,转为数值时为0。典型用法是:作为函数的参数,表示该函数的参数不是对象。作 为对象原型链的终点。
b、undefined表示"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为NaN。典型用法是:变量被声明了,但没 有赋值时,就等于undefined。调用函数时,应该提供的参数没有提供,该参数等于undefined。对象没有赋值的属性,该属性的 值为undefined。函数没有返回值时,默认返回undefined。
c、undeclared:js语法错误,没有申明直接使用,js无法找到对应的上下文。
如何在JavaScript中每x秒调用一个函数
JS 中 == 和 === 区别是什么?
a、对于string,number等基础类型,和=有区别:不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如 果类型不同,其结果就是不等。同类型比较,直接进行“值”比较,两者结果一样。
b、对于Array,Object等高级类型,和=没有区别,进行“指针地址”比较。
JavaScript内置可用类型
string,number,boolean,null和undefined,object,symbol(ES6新语法)
jQuery 库中的 $() 是什么?
( ) 函 数 是 j Q u e r y ( ) 函 数 的 别 称 。 () 函数是 jQuery() 函数的别称。 ()函数是jQuery()函数的别称。() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。你可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。
JQuery有几种选择器?
a、基本选择器:#id,class,element,*;
b、层次选择器:parent > child,prev + next ,prev ~ siblings
c、基本过滤器选择器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt
d、表单选择器: :input ,:text ,:password ,:radio ,:checkbox ,:submit 等;
e、表单过滤器选择器::enabled ,:disabled ,:checked ,:selected
jquery中 . g e t ( ) 提 交 和 .get()提交和 .get()提交和.post()提交有区别吗?
相同点:都是异步请求的方式来获取服务端的数据; 异同点:
a、请求方式不同: . g e t ( ) 方 法 使 用 G E T 方 法 来 进 行 异 步 请 求 的 。 .get() 方法使用GET方法来进行异步请求的。 .get()方法使用GET方法来进行异步请求的。.post() 方法使用POST方法来进行异步请求的。
b、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器 的,这种传递是对用户不可见的。
c、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多
d、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。
window.onload()函数和jQuery中的document.ready()有什么区别?
a、执行时间:window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。 ( d o c u m e n t ) . r e a d y ( ) 是 D O M 结 构 绘 制 完 毕 后 就 执 行 , 不 必 等 到 加 载 完 毕 。 (document).ready()是DOM结构绘制 完毕后就执行,不必等到加载完毕。 (document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。(document).ready()在 window.onload之前执行。
b、简化写法:window.onload没有简化写法。 ( d o c u m e n t ) . r e a d y ( f u n c t i o n ( ) ) 可 以 简 写 成 (document).ready(function(){})可以简写成 (document).ready(function())可以简写成(function(){});
c、出现地方不同:window.onload是js标准,可出现在任何js脚本中。$(document).ready只有在jq库中出现。
什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统。CDN的目标是为具有高可 用性和高性能的最终用户提供内容。
有3个流行的jQuery CDN:谷歌,微软jQuery。
使用CDN的优势:它减少了服务器的负载。它节省了带宽。jQuery框架将从这些CDN加载更快。最重要的好处是,如果用户访 问过使用任何这些CDN的jQuery框架的任何站点,它将被缓存
如何从CDN加载jQuery?
五、JSP技术
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请 求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
2. jsp和servlet的区别、共同点、各自应用的范围?
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于: Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩 展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于 控制层.
3. Servlet API中forward()与redirect()的区别?
a、从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览 器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客 户端向服务器端发出两次request,同时也接受两次response。
b、从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.redirect不仅可以重定向到当前应用程序 的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.forward方法 只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.redirect 是服务器通知客户端,让客户端重新发起请求.所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "。
c、从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. d、从效率来说
forward:高. redirect:低.
4. request.getAttribute()和 request.getParameter()有何区别?
a、request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据。 b、getAttribute是返回对象,getParameter返回字符串
c、getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()设置之后,才能够通过getAttribute()来获得
值,它们传递的是Object类型的数据。而且必须在同一个request对象中使用才有效。,而getParameter()是接收表单的get或者 post提交过来的参数
5. MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑, 处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
6. jsp有哪些内置对象?作用分别是什么?
a、request 用户端请求,此请求会包含来自GET/POST请求的参数b、response 网页传回用户端的回应
c、pageContext 网页的属性是在这里管理d、session 与请求有关的会话期
e、application 封装服务器运行环境的对象;
f、out 输出服务器响应的输出流对象; g、config Web 应用的配置对象;
h、page JSP网页本身
i、exception 封装页面抛出异常的对象。
7. 说一下 JSP 的 4 种作用域?
page:代表与一个页面相关的对象和属性。
request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
8. session 和 cookie 有什么区别?
a、存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
b、安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
c、容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
d、存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。
9. 说一下 session 的工作原理?
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
10. JSP三大指令是什么?
Page :指令是针对当前页面的指令,Include :用于指定如何包含另一个页面,Taglib :用于定义和指定自定义标签。
11. http的响应码200,404,302,500表示的含义分别是?
200 - 确定。客户端请求已成功
302 - 临时移动转移,请求的内容已临时移动新的位置
404 - 未找到文件或目录
500 - 服务器内部错误
12. 如何解决表单提交的中文乱码问题
a、设置页面编码,若是jsp页面,需编写代码<%@page language=“java” pageEncoding=“UTF-8” contentType=“text/html;charset=UTF-8” %>
若 是 html 页 面 , 在 网 页 头 部 ( < head>< /head> ) 中 添 加 下 面 这 段 代 码 < meta http-equiv=“Content-Type” content=“text/html; charset=utf-8” />
b 、 将 form 表 单 提 交 方 式 变 为 post 方 式 , 即 添 加 method=“post”; ) 在 Servlet 类 中 编 写 代 码request.setCharacterEncoding(“UTF-8”),而且必须写在第一行。
c 、 如 果 是 get 请 求 , 在 Servlet 类 中 编 写 代 码 byte [] bytes = str.getBytes(“iso-8859-1”);String cstr = new String(bytes,“utf-8”);
或者直接修改Tomcat服务器配置文件server.xml增加内容:URIEncoding=“utf-8”
13. 你的项目中使用过哪些JSTL标签?
项目中主要使用了JSTL的核心标签库,包括< c:if>、< c:choose>、< c: when>、< c: otherwise>、< c:forEach>等,主要用于构造循环和分支结构以控制显示逻辑。虽然JSTL标签库提供了core、sql、fmt、xml等标签库,但是实际开发中建议只使 用核心标签库(core),而且最好只使用分支和循环标签并辅以表达式语言(EL),这样才能真正做到数据显示和业务逻辑的分离,这才是最佳实践。
14. 怎么防止重复提交
a、禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果 客户端把Javascript给禁止掉,这种方法就无效了。
b、Post/Redirect/Get模式。在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。
c、在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏 域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。如果发现表单提交里没 有有效的标志串,这说明表单已经被提交过了,忽略这次提交。
d、在数据库里添加约束。在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方 法。
15. Request对象的主要方法有哪些?
方法 解释
setAttribute(String name,Object) 设置名字为name的request 的参数值
getAttribute(String name) 返回由name指定的属性值
getAttributeNames() 返回request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies() 返回客户端的所有 Cookie 对象,结果是一个Cookie 数组
getCharacterEncoding() 返回请求中的字符编码方式 = getContentLength() :返回请求的 Body的长度
getParameter(String name) 获得客户端传送给服务器端的有 name指定的参数值
getRequestURI() 获取发出请求字符串的客户端地址
getRemoteAddr() 获取客户端的 IP 地址
getRemoteHost() 获取客户端的名字
getServletPath() 获取客户端所请求的脚本文件的路径
getServerPort() 获取服务器的端口号
removeAttribute(String name) 删除请求中的一个属性
六、Spring框架(每个框架的运行原理,调用过程)
d、session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
e、global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
7. Spring支持的事务管理类型
a、编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
b、声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
8. 你更倾向用那种事务管理类型?
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。 声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
9. 解释AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源码的基础上,还能对源码进行前后增强。
10. 什么是通知?有哪五种类型的通知?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知:
a、before:前置通知,在一个方法执行前被调用。
b、after: 在方法执行之后调用的通知,无论方法执行是否成功。c、after-returning: 仅当方法成功完成后执行的通知。
d、after-throwing: 在方法抛出异常退出时执行的通知。e、around: 在方法执行之前和之后调用的通知。
七、SpringMVC框架
b、DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
c、处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
d、DispatcherServlet 调用 HandlerAdapter 处理器适配器。
e、HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)。
f、Controller 执行完成返回 ModelAndView。
g. HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。h、DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
i、ViewReslover 解析后返回具体 View。
g、DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
k、DispatcherServlet 响应用户。
4. 如果你也用过 struts2.简单介绍下 springMVC 和 struts2 的区别有哪些?
a、springmvc 的入口是一个 servlet 即前端控制器,而 struts2 入口是一个 filter 过虑器。
b、springmvc 是基于方法开发(一个 url 对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),
struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。
c、Struts 采用值栈存储请求和响应的数据,通过 OGNL 存取数据,springmvc 通过参数解析器是将 request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView对象,最后又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认使用 jstl。
5. @RequestMapping 注解用在类上面有什么作用?
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路 径。
具体步骤如下 :
a、加入 Jackson.jar
b、在配置文件中配置 json 的映射
c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody
get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”) ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
八、Mybatis框架
什么是 MyBatis?
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。
Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
a、Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。b、Mybatis 提 供 了 9 种 动 态 sql 标 签 : trim|where|set|foreach|if|choose|when|otherwise|bind。
c、其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。
#{}和KaTeX parse error: Expected 'EOF', got '#' at position 13: {}的区别是什么? a、#̲{}是预编译处理,{}是字符串替换。
b、Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
c、Mybatis 在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。
d、使用#{}可以有效的防止 SQL 注入,提高系统安全性。
为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动ORM 映射工具。
MyBatis 与 Hibernate 有哪些不同?
a、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对象。
b、Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。
c、Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
MyBatis 的好处是什么?
a、MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带来了很大便利。
b、MyBatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象, 大大简化了 Java 数据库编程的重复工作。
c、因为 MyBatis 需要程序员自己去编写 sql 语句,程序员可以结合数据库自身的特点灵活控制 sql 语句,因此能够实现比 Hibernate 等全自动 orm 框架更高的查询效率,能够完成复杂查询。
什么是 MyBatis 的接口绑定,有什么好处?
接口映射就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定,我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置.
接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update 等注解里面包含 Sql 语句来绑定,另外一种就是通过 xml 里面写 SQL 来绑定,在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名.
当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
a、通过在查询的 sql 语句中定义字段名的别名。
b、通过来映射字段名和实体类属性名的一一对应的关系。
Mapper DAO层开发规范
a、接口的全路径要和映射文件的namespace保持一致
b、接口的方法名要和映射文件中的statementId保持一致
c、接口方法的参数类型,返回类型要和映射文件中的parameterType,resultType保持一致 d、接口和映射文件的名字最好保持一致 例如:UserMapper.java/UserMapper.xml
e、接口和映射文件最好放到同一个目录
九、shiro安全框架
十、maven
十一、Linux系统
绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
a、绝对路径:如/etc/init.d
b、当前目录和上层目录:./ …/ c、主目录:~/
d、切换目录:cd
怎么查看当前进程?怎么执行退出?怎么查看当前路径?
a、查看当前进程:ps b、执行退出:exit
c、查看当前路径:pwd
怎么清屏?怎么退出当前命令?
a、清屏:clear
b、退出当前命令:ctrl+c 彻底退出
查看文件内容有哪些命令可以使用?
a、vi 文件名 #编辑方式查看,可修改b、cat 文件名 #显示全部文件内容
c、more 文件名 #分页显示文件内容
d、less 文件名 #与 more 相似,更好的是可以往前翻页
e、tail 文件名 #仅查看尾部,还可以指定行数f、head 文件名 #仅查看头部,还可以指定行数
复制文件包括其子文件到自定目录
创建目录
删除目录(此目录是空目录)
删除文件包括其子文件
解压文件
解压zip 文件
十二、Redis存储系统
g、lpop key 从左边移出一个元素
h、rpop key 从右边移出一个元素
i、keys * 返回所有的key 可以加*通配
j、exists key判断string类型一个key是否存在 如果存在返回1 否则返回0
6. Redis 主要消耗什么物理资源?
内存
7. Redis 有哪几种数据淘汰策略?
1、noeviction:返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。
2、allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
3、volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
4、allkeys-random: 回收随机的键使得新添加的数据有空间存放。
5、volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
6、volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
关系,配置应用程序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做所有事情。
Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spring 框架之上。使用spring 启动,我们避免了之前我们必须做的所有样板代码和配置。因此,Spring Boot 可以帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。
2. Spring Boot 有哪些特点 ?
a、为 Spring 开发提供一个更快、更广泛的入门体验。
b、开箱即用,远离繁琐的配置。
c、提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置 等。
d、绝对没有代码生成,也不需要XML配置。
3. Spring Boot 有哪些优点?
a、减少开发,测试时间和努力。
b、使用 JavaConfig 有助于避免使用 XML。c、避免大量的 Maven 导入和各种版本冲突。
d、通过提供默认值快速开始开发。没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。
e、需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active =
{enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程序属性文件。
4. Spring Boot、Spring MVC 和 Spring 有什么区别?
a、Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
b 、Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet , MoudlAndView 和ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
c、Spring 和 SpringMVC 的问题在于需要配置大量的参数。Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解: @SpringBootConfiguration: 组 合 了 @Configuration 注 解 , 实 现 配 置 文 件 的 功 能 。 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
6. Spring Boot 需要独立的容器运行吗?
可以不需要,内置了 Tomcat/ Jetty 等容器。
1
2 org.springframework.boot
3 spring-boot-devtools
4 true
5
十四、SpringCloud
Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring Boot开发框架的集成。
Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。
Spring Cloud 为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接
2. Spring Cloud与Dubbo的区别是什么?
spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。
9. 什么是Eureka注册中心?
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中, 以实现Spring Cloud的服务注册于发现,同时还提供了负载均衡、故障转移等能力。
10. 负载平衡的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而 不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器 进程。
十五、Dubbo
Dubbo是什么?
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。
Dubbo默认使用什么注册中心,还有别的选择吗?
推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。
在 Provider 上可以配置的 Consumer 端的属性有哪些?
a、timeout:方法调用超时
b、retries:失败重试次数,默认重试 2 次c、loadbalance:负载均衡算法,默认随机 d、actives 消费者端,最大并发调用限制
Dubbo推荐使用什么序列化框架,你知道的还有哪些?
推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。
你还了解别的分布式框架吗?
别的还有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle 等。
Dubbo内置了哪几种服务容器?
Spring Container,Jetty Container,Log4j Container
Dubbo 核心的配置有哪些?
Dubbo有哪几种集群容错方案,默认是哪种?
Dubbo有哪几种负载均衡策略,默认是哪种?
dubbo的优势
a、单一应用架构,当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增 删改查工作量的 数据访问框架(ORM)是关键。
b、垂直应用架构,当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效 率。此时,用于加速前端页面开发的 Web框架(MVC)是关键。
c、分布式服务架构,当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的 服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的 分布式服务框架(RPC)是关键。
d、流动计算架构当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实 时管理集群容量,提高集群利用率。此时,用于提高机器利用率的 资源调度和治理中心(SOA)是关键。
十六、zookeeper
ZooKeeper 是什么?
ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
ZooKeeper 提供了什么?
a、文件系统b、通知机制
Zookeeper 文件系统
Zookeeper提供一个多层级的节点命名空间(节点称为znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于 存放大量的数据,每个节点的存放数据上限为1M。
四种类型的数据节点 Znode
a、PERSISTENT-持久化目录节点客户端与zookeeper断开连接后,该节点依旧存在
b、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
c、EPHEMERAL-临时目录节点客户端与zookeeper断开连接后,该节点被删除
d、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
Zookeeper通知机制
client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。
zookeeper负载均衡和nginx负载均衡区别
zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件;但是nginx的吞吐量比zk大很多,应该说按业务选择用哪种方式。
Zookeeper工作原理
Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
zookeeper是如何保证事务的顺序一致性的?
zookeeper采用了递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是 epoch(时期; 纪元; 世; 新时代)用来标识leader是否发生改变,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
十七、JVM面试专题()jvm优化,数据库优化
内存模型以及分区,需要详细到每个区放什么?
JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class 类信息常量池(static 常量和 static 变量)等放在方法区a、方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据
b、堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配
c、栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类 型,所以还是一个指向地址的指针
d、本地方法栈:主要为 Native 方法服务e、程序计数器:记录当前线程执行的行号
堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含 Eden+Survivor 区,survivor 区里面分为 from 和 to 区, 内存回收时,如果用的是复制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,就会使用下一个Survive,这样循环使用。如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。
GC 的两种判定方法:
a、引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的情况
b、引用链法: 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 变量)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以回收
GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
先标记,标记完毕之后再清除,效率不高,会产生碎片复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC标记整理:标记完毕之后,让所有存活的对象向一端移动。
GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间串行收集器:次要回收中使用多线程来执行
CMS 收集器是基于“标记—清除”算法实现的,经过多次标记才会被清除
G1 从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复制”算法实现的
Minor GC 与 Full GC 分别在什么时候发生?
新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC
简述 java 垃圾回收机制?
在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合 中,进行回收。
java 中垃圾收集的方法有哪些?
a、标记-清除:这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题:1.效率不高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次 GC 动作。
b、复制算法:为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。于是将该算法进行了改进,内存区域不再是按照 1:1 去划分,而是将内存划分为8:1:1 三部分,较大那份内存交 Eden 区,其余是两块较小的内存区叫 Survior 区。每次都会优先使用 Eden 区,若 Eden 区满,就将对象复制到第二块内存区上,然后清除 Eden 区,如果此时存活的对象太多,以至于 Survivor 不够时,会将这些对象通过分配担保机制复制到老年代中。(java 堆又分为新生代和老年代)
c、标记-整理:该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。
d、分代收集:现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。
简述 java 类加载机制?
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型。
什么是类加载器,类加载器有哪些?
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有一下四种类加载器:
a、启动类加载器(Bootstrap ClassLoader)用来加载 java 核心类库,无法被 java 程序直接引用。
b、扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
c、 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。
d、用户自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现。
说一下 JVM 调优的工具?
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。jconsole:用于对 JVM 中的内存、线程和类等进行监控;
jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
常用的 JVM 调优的参数都有哪些?
-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。