试题2020.1.14
1.下列哪些语句关于内存回收的说明是正确的? ( )
正确答案: B 你的答案: D (错误)
程序员必须创建一个线程来释放内存
内存回收程序负责释放无用内存
内存回收程序允许程序员直接释放内存
内存回收程序可以在指定的时间释放内存对象
链接:https://www.nowcoder.com/questionTerminal/c8435ed863a14f84afc3f32d8f1e28bf
来源:牛客网
正确答案: C 你的答案: C (正确)
volatile,synchronized 都可以修改变量,方法以及代码块
volatile,synchronized 在多线程中都会存在阻塞问题
volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性
synchronized关键字和volatile关键字比较:
- volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
- 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞
- volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
- volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性
3.关于中间件特点的描述.不正确的是()
正确答案: A 你的答案: A (正确)
中间件运行于客户机/服务器的操作系统内核中,提高内核运行效率
中间件应支持标准的协议和接口
中间件可运行于多种硬件和操作系统平台上
跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互
链接:https://www.nowcoder.com/questionTerminal/bb7b8938da2c403c96e4d320d88163f6
来源:牛客网
正确答案: D 你的答案: D (正确)
Serial收集器
parNew收集器
CMS收集器
G1收集器
1.Serial收集器
单线程收集器,收集时会暂停所有工作线程(我们将这件事情称之为Stop The World,下称STW),使用复制收集算法,虚拟机运行在Client模式时的默认新生代收集器。
2.ParNew收集器
ParNew 收集器就是Serial的多线程版本,除了使用多条收集线程外,其余行为包括算法、STW、对象分配规则、回收策略等都与Serial收集器一摸一样。对 应的这种收集器是虚拟机运行在Server模式的默认新生代收集器,在单CPU的环境中,ParNew收集器并不会比Serial收集器有更好的效果。
3.Parallel Scavenge收集器
Parallel Scavenge收集器(下称PS收集器)也是一个多线程收集器,也是使用复制算法,但它的对象分配规则与回收策略都与ParNew收集器有所不同,它是 以吞吐量最大化(即GC时间占总运行时间最小)为目标的收集器实现,它允许较长时间的STW换取总吞吐量最大化。
4.Serial Old收集器
Serial Old是单线程收集器,使用标记-整理算法,是老年代的收集器,上面三种都是使用在新生代收集器。
5.Parallel Old收集器
老年代版本吞吐量优先收集器,使用多线程和标记-整理算法,JVM 1.6提供,在此之前,新生代使用了PS收集器的话,老年代除Serial Old外别无选择,因为PS无法与CMS收集器配合工作。
6.CMS(Concurrent Mark Sweep)收集器
CMS 是一种以最短停顿时间为目标的收集器,使用CMS并不能达到GC效率最高(总体GC时间最小),但它能尽可能降低GC时服务的停顿时间,这一点对于实时或 者高交互性应用(譬如证券交易)来说至关重要,这类应用对于长时间STW一般是不可容忍的。CMS收集器使用的是标记-清除算法,也就是说它在运行期间会 产生空间碎片,所以虚拟机提供了参数开启CMS收集结束后再进行一次内存压缩。
5.
正确答案: C 你的答案: C (正确)
HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。
HashMap 的实现不是同步的,意味着它不是线程安全的
HashMap通过开放地址法解决哈希冲突
HashMap中的key-value都是存储在Entry数组中的
1. 开放定址法:线性探测再散列、二次探测再散列、再随机探测再散列;
2. 再哈希法:换一种哈希函数;
3. 链地址法 :在数组中冲突元素后面拉一条链路,存储重复的元素;
4. 建立一个公共溢出区:其实就是建立一个表,存放那些冲突的元素。
什么时候会产生冲突
HashMap中调用 hashCode() 方法来计算hashCode。
6.DBMS 中实现事务持久性的子系统是()
正确答案: D 你的答案: D (正确)
安全性管理子系统
完整性管理子系统
并发控制子系统
7.假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是() boolean isOdd = false; for(int i=1;i<=2;++i) { if(i%2==1)isOdd = true; else isOdd = false; a+=i*(isOdd?1:-1); } 正确答案: D 你的答案: D (正确) -1 -2 0 1
链接:https://www.nowcoder.com/questionTerminal/2be86af464c04b9c9d7895d62dd46732
来源:牛客网
8.关于下面的一段代码,以下哪些说法是正确的: public static void main(String[] args) { String a = new String("myString"); String b = "myString"; String c = "my" + "String"; String d = c; System.out.print(a == b); System.out.print(a == c); System.out.print(b == c); System.out.print(b == d); } 正确答案: A D 你的答案: C D (错误) System.out.print(a == b)打印出来的是false System.out.print(a == c)打印出来的是true System.out.print(b == c)打印出来的是false System.out.print(b == d)打印出来的是true
链接:https://www.nowcoder.com/questionTerminal/2e91232158704054a48f54d73619953f
来源:牛客网
9.Java7特性中,abstract class和interface有什么区别。 正确答案: A B D 你的答案: A B D (正确) 抽象类可以有构造方法,接口中不能有构造方法 抽象类中可以有普通成员变量,接口中没有普通成员变量 抽象类中不可以包含静态方法,接口中可以包含静态方法 一个类可以实现多个接口,但只能继承一个抽象类。
链接:https://www.nowcoder.com/questionTerminal/76a029a6196c488699c2f27c10b76c09
来源:牛客网
抽象类和接口的区别:
接口中可以包含静态方法 ”,jdk1.8中可以有,而jdk1.7编译错误
10.关于多线程和多进程,下面描述正确的是(): 正确答案: A C 你的答案: A C (正确) 多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。 线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。 线程的通信速度更快,切换更快,因为他们在同一地址空间内。 一个线程可以属于多个进程。
1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
2、资源分配给进程,同一进程的所有线程共享该进程的所有资源。
3、线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
4、处理机分给线程,即真正在处理机上运行的是线程。
5、线程是指进程内的一个执行单元,也是进程内的可调度实体。
1 11.关于下面一段代码,以下说法正确的是: () 2 3 public class Test { 4 private synchronized void a() { 5 } 6 private void b() { 7 synchronized (this) { 8 } 9 } 10 private synchronized static void c() { 11 } 12 private void d() { 13 synchronized (Test.class) { 14 } 15 } 16 } 17 18 正确答案: A C D 你的答案: A C D (正确) 19 同一个对象,分别调用方法a和b,锁住的是同一个对象 20 同一个对象,分别调用方法a和c,锁住的是同一个对象 21 同一个对象,分别调用方法b和c,锁住的不是同一个对象 22 同一个对象,分别调用方法a、b、c,锁住的不是同一个对象
链接:https://www.nowcoder.com/questionTerminal/718f28312bf34cbdb00bc80ee42b83e4
来源:牛客网
- 同步代码块(synchronized(this),synchronized(类实例对象),锁是小括号()中的实例对象)
- 同步非静态方法(synchronized method),锁的是当前对象的实例对象
- 同步代码块(synchronized(类.class)),锁是最小括号 () 中的类对象(Class对象)
- 同步静态方法(synchronized static method),锁是当前对象的类对象(Class 对象)
- 有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
- 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块的线程会被阻塞。
- 若锁住的是同一个对象,一个线程在访问对象的同步方法时,另一个访问对象的同步方法的线程会被阻塞。
- 若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象同步方法的线程会被阻塞,反之亦然。
- 同一个类的不同对象的锁互不干扰
- 类锁由于也是一种特殊的对象锁,因此表现和上述一致,而由于一个类只有一把对象锁,所以同一个类的不同对象使用类锁将会是同步的
- 类锁和对象锁互不干扰
来源:牛客网
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:
普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
1 12.关于Java中的ClassLoader下面的哪些描述是错误的:( ) 2 正确答案: B D F 你的答案: B D F (正确) 3 默认情况下,Java应用启动过程涉及三个ClassLoader: Boostrap, Extension, System 4 一般的情况不同ClassLoader装载的类是不相同的,但接口类例外,对于同一接口所有类装载器装载所获得的类是相同的 5 类装载器需要保证类装载过程的线程安全 6 ClassLoader的loadClass在装载一个类时,如果该类不存在它将返回null 7 ClassLoader的父子结构中,默认装载采用了父优先 8 所有ClassLoader装载的类都来自CLASSPATH环境指定的路径
链接:https://www.nowcoder.com/questionTerminal/fc4945cd85144adca811aae468a77c20
来源:牛客网
- Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。
- Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
2. Extention ClassLoader
3. AppClassLoader
1 13.下列哪些方法是针对循环优化进行的 2 正确答案: A B D 你的答案: A B D (正确) 3 强度削弱 4 删除归纳变量 5 删除多余运算 6 代码外提
常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除
(下面抄几页PPT和别人的博客,QAQ,关键是编译原理没认真学过,咱家不太会。。。)
如果有同学有研究过这部分内容,并总结过,有更好的答案,请联系我删除本篇非原创解答
复写传播:
- 复写语句:形式为f = g 的赋值
- 优化过程中会大量引入复写
- 复写传播变换的做法是在复写语句f = g后,尽可能用g代表f
- 复写传播变换本身并不是优化,但它给其他优化带来机会
- 常量合并(编译时可完成的计算)
- 死代码删除
死代码删除
- 死代码是指计算的结果决不被引用的语句
- 一些优化变换可能会引起死代码
代码外提
- 代码外提是循环优化的一种
- 循环优化的其它重要技术
- 归纳变量删除
- 强度削弱
例:
1 while(i <= limit - 2) ... 2 // 代码外提后变成 3 t = limit - 2; 4 while(i <= t) ...
归纳变量删除
1 j = j - 1 2 t4 = 4 * j 3 t5 = a[t4] 4 if t5 > value goto B3
- j和t4的值步伐一致地变化,这样的变量叫作归纳变量
- 在循环中有多个归纳变量时,也许只需要留下一个
- 这个操作由归纳变量删除过程来完成
- 对本例可以先做强度削弱,它给删除归纳变量创造机会
强度削弱
- 强度削弱的本质是把强度大的运算换算成强度小的运算,例如将乘法换成加法运算。