JVM知识点题目

JVM是Java程序的运行环境,因此对于JVM的掌握有助于理解Java程序的执行以及编写,尤其是运行时碰到的一些诡异问题,那么怎么样能考察自己对于JVM关键知识点的掌握情况,帮助学习JVM机制呢,在这篇blog中来探讨下。

对于Java程序而言,JVM的关键机制有:字节码的加载、方法的执行、对象内存的分配和回收、线程和锁机制,这几个机制涉及到的jvm的知识点远没有写这几个字这么简单,里面的复杂度还是非常高的。

字节码的加载
JVM通过ClassLoader来完成字节码的动态加载,这里面涉及到的主要是ClassLoader的双亲委派、ClassLoader的编写方法、Class是否被加载的唯一标识以及Class的加载过程。
在考察的时候我觉得可以以这么两道简单的题来考察:
1、写一段将目录中指定的.class文件加载到JVM的程序,并通过Class对象获取到完整类名等信息;
2、一段展示代码,里面包含一个全局静态整型变量,问如果用两个ClassLoader加载此对象,执行这个整型变量++操作后结果会是怎么样的?

方法的执行
JVM有自己的一套指令系统,字节码中即已经是指令了,需要大概掌握了JVM对static、interface、instance、构造器采用的不同的执行方法,另外就是JVM中反射的实现(可以以Sun JDK来举例)、动态代理的实现,最后相关的就是JVM执行字节码的方式(解释、JIT、Hotspot),以及什么时候触发编译成机器码,如何控制。
在考察的时候我觉得可以以这么三道题来考察:
1、A a=new A();a.execute();和IA a=new A();a.execute();执行有什么不同;
2、反射的性能低的原因是?
3、编写一段程序,动态的创建一个接口的实现,并加载到JVM中执行;(可以允许用BCEL等工具)

对象内存的分配和回收
这块涉及的知识点也是比较的多,例如JVM内存区域的划分、自然类型和引用类型的内存分配的不同、TLAB、GC的算法、Sun JDK对于GC的实现、GC触发的时机、GC的跟踪和分析的方法。
在考察的时候我觉得可以以这么三道题来考察:
1、经典的String比较程序题:
   String a="a";
   String b="b";
   String ab="ab";
   (a+b)==ab;  ??  (引深题,如何才能让(a+b)==ab)
   ("a"+"b")==ab; ?? 
2、写一段程序,让其OutOfMemory,或频繁执行Minor GC,但又不触发Full GC,又或频繁执行Full GC,但不执行minor GC,而且不OutOfMemory,甚至可以是控制几次Minor GC后发生一次Full GC;
3、详细讲解GC的实现,例如minor GC的时候导致是怎么回收对象内存的,Full GC的时候是怎么回收对象内存的。

线程和锁机制
这块涉及的知识点仍然是非常的多,例如线程中变量的操作机制、线程调度机制、线程的状态以及控制方法、线程的跟踪和分析方法、同步关键字、lock/unlock的原理等。
在考察的时候我觉得可以以这么几道题考察下:
1、i++的执行过程;
2、一个线程需要等待另外一个线程将某变量置为true才继续执行,如何编写这段程序,或者如何控制多个线程共同启动等;
3、控制线程状态的转换的方法,或者给几个thread dump,分析下哪个线程有问题,问题出在哪;
4、static属性加锁、全局变量属性加锁、方法加锁的不同点?

posted on 2009-03-27 14:30 BlueDavy 阅读(9502) 评论(9)  编辑  收藏 所属分类: Java

评论

# re: JVM知识点题目 2009-03-27 15:28 flyisland

希望不是你当面试官,哈  回复  更多评论   

# re: JVM知识点题目 2009-03-27 16:05 云襄

JVM的东西的确比较复杂  回复  更多评论   

# re: JVM知识点题目 2009-03-27 19:27 问问

都不是很懂,什么时候贴答案啊?  回复  更多评论   

# re: JVM知识点题目[未登录] 2009-03-27 20:15 逝水fox

看了问题 很想知道答案 看书去咯  回复  更多评论   

# re: JVM知识点题目[未登录] 2009-03-28 15:55 kimi

关于ClassLoader的两个问题
第一个题目把文件系统中的.class文件读到一个bute数组中,使用ClassLoader的defineClass方法把这个byte数组传递给jvm,则返回一个Class对象,通过这个Class对象可以做关于一个对象的任何事情,但defineClass方法是protected的,所以要写一个ClassLoader的子类,也就是实现一个自己的ClassLoader。

第二个题目由于Java中ClassLoader本质上是定义了一个Class的集合,而且ClassLoader之间是项目隔离的,除非它们之间是父子关系,但即使这样,只能是子ClassLoader能看到父ClassLoader定义的Class,父ClassLoader看不到子ClassLoader定义的Class,所以使用一个ClassLoader加载的类的静态变量执行++操作,对另一个ClassLoader加载的对象的静态变量是没有影响的。

班门弄斧了,还请博主指正我的回答是否正确。  回复  更多评论   

# re: JVM知识点题目 2009-05-24 01:51 ttt

老大,给个答案啊,别变成炫耀贴了。  回复  更多评论   

# re: JVM知识点题目 2011-12-31 14:33 whwang

这题太狠了:
3、编写一段程序,动态的创建一个接口的实现,并加载到JVM中执行;(可以允许用BCEL等工具)
  回复  更多评论   

# re: JVM知识点题目 2012-01-02 00:23 斌斌

将目录里的*.class filter出来,getName一个个来  回复  更多评论   

# re: JVM知识点题目 2012-08-10 17:04 jb

1.1 findclass
1.2 不同classloader加载的class是不同的class,其实包名与文件名都相同

2.3用asm 框架 writeclass  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜