招聘面试 摩根面试准备要点(J)

上传人:蜀歌 文档编号:154742840 上传时间:2020-12-07 格式:PDF 页数:100 大小:616.51KB
返回 下载 相关 举报
招聘面试 摩根面试准备要点(J)_第1页
第1页 / 共100页
招聘面试 摩根面试准备要点(J)_第2页
第2页 / 共100页
招聘面试 摩根面试准备要点(J)_第3页
第3页 / 共100页
招聘面试 摩根面试准备要点(J)_第4页
第4页 / 共100页
招聘面试 摩根面试准备要点(J)_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《招聘面试 摩根面试准备要点(J)》由会员分享,可在线阅读,更多相关《招聘面试 摩根面试准备要点(J)(100页珍藏版)》请在金锄头文库上搜索。

1、招聘面试 摩根面试准备要点(J)招聘面试 摩根面试准备要点(J) 摩根面试准备要点摩根面试准备要点 1.JVM 架构(Vincent)JVM 架构(Vincent) 主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。 Class loader 子系统的作用Class loader 子系统的作用 :根据给定的全限定名类名(如 java.lang.Object)来装 载 class 文件的内容到 Runti

2、me data area 中的 method area(方法区域)。Javsa 程序员可 以 extends java.lang.ClassLoader 类来写自己的 Class loader。 Execution engine 子 系 统 的 作 用Execution engine 子 系 统 的 作 用 : 执 行 classes 中 的 指 令 。 任 何 JVM specification 实现(JDK)的核心是 Execution engine, 换句话说:Sun 的 JDK 和 IBM 的 JDK 好坏主要取决于他们各自实现的 Execution engine 的好坏。每个运行中的

3、线程都有一 个 Execution engine 的实例。 Native interface 组件Native interface 组件 :与 native libraries 交互,是其它编程语言交互的接口。 Runtime data area 组件:这个组件就是 JVM 中的内存。 下面对这个部分进行详细 介绍。 Runtime data area 的整体架构图 Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域 ), Java Stack(java 的栈), Program Counter(程序计数器), Native method

4、 stack(本地方法栈)。Heap 和 Method Area 是被所有线程的共享使用的 ; 而 Java stack, Program counter 和 Native method stack 是以线程为粒度的,每个线 程独自拥有。 Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域 ), Java Stack(java 的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap 和 Method Area 是被所有线程的共享使用的 ; 而 Java stack, Pro

5、gram counter 和 Native method stack 是以线程为粒度的,每个线 程独自拥有。 HeapHeap Java 程序在运行时创建的所有类实或数组都放在同一个堆中。而一个 Java 虚拟 实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个 java 程序独 占一个 JVM 实例,因而每个 java 程序都有它自己的堆空间,它们不会彼此干扰。 但是同一 java 程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对 象(堆数据)的同步问题。 (这里可能出现的异常 java.lang.OutOfMemoryError: Java heap space) Meth

6、od areaMethod area 在 Java 虚拟机中,被装载的 class 的信息存储在 Method area 的内存中。当虚 拟机装载某个类型时,它使用类装载器定位相应的 class 文件,然后读入这个 class 文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并 将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。 与 Heap 一样,method area 是多线程共享的,因此要考虑多线程访问的同步问 题。比如,假设同时两个线程都企图访问一个名为 Lava 的类,而这个类还没有 内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则

7、只能 等待。 (这里可能出现的异常 java.lang.OutOfMemoryError: PermGen full) Java stackJava stack Java stack 以帧为单位保存线程的运行状态。虚拟机只会直接对 Java stack 执行两种操作 : 以帧为单位的压栈或出栈。每当线程调用一个方法的时候, 就对当前状态作为一个帧保存到 java stack 中(压栈); 当一个方法调用返回时, 从 java stack 弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现 StackOverFlow 问题。 下面的程序可以说明这个问题。 public class Test

8、StackOverFlow public static void main(String args) Recursive r = new Recursive(); r.doit(10000); / Exception in thread main java.lang.StackOverflowError class Recursive public int doit(int t) if (t = 1) return 1; return t + doit(t - 1); Program counterProgram counter 每个运行中的 Java 程序,每一个线程都有它自己的 PC 寄存

9、器,也是该线程启动时创建的。 PC 寄存器的内容总是指向下一条将被执行指令的地址;,这里的地址可以是一个本地指针, 也可以是在方法区中相对应于该方法起始指令的偏移量。 Native method stackNative method stack 对于一个运行中的 Java 程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线 程调用一个本地方法时, 它就进入了一个全新的并且不再受虚拟机限制的世界。 本地方法可 以通过本地方法接口来访问虚拟机的运行时数据区, 不止与此, 它还可以做任何它想做的事 情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和 JVM 相同 的能力

10、和权限。 (这里出现 JVM 无法控制的内存溢出问题 native heap OutOfMemory ) 2.CLassLoader (Vincent)CLassLoader (Vincent) Java 的可执行文件不同于 C/C+,Java 编译器只产生中间字节码文件(.class 文件),由 Java 虚拟机 (java.exe)解释执行。Java 发布的程序(JAR 包)也多半是一堆 class 文件,运行时由 ClassLoader 加 载到 Java 虚拟机中执行。ClassLoader 是 Java 虚拟机的主要组成部分,由 Java 语言编写,用户可以实现 自定义的 Class

11、Loader 来完成特定的功能。下面我们用例子说明 ClassLoader。 JVM 规范定义了两种类型的 ClassLoader:Bootstrap ClassLoader 和 User-defined ClassLoader。 JVM 在运行时会产生三个 ClassLoader:Bootstrap ClassLoader、Extension ClassLoader 和 AppClassLoader。Bootstrap 是用 C+编写的,我们在 Java 中看不到它,是 null,是 JVM 自带的类装载器, 用来装载核心类库, 如 java.lang.*等。 AppClassLoader

12、的 Parent 是 ExtClassLoader, 而 ExtClassLoader 的 Parent 为 Bootstrap ClassLoader。 3.java 中,什么叫不可更改的类(immutable class) (Kevin Tam) java 中,什么叫不可更改的类(immutable class) (Kevin Tam) 从字面意思来理解就是不会发生变化的类,那么是什么不会发生变化呢,其实就 是类的状态,也就是不变类的实例一旦被创建,其状态就不会发生变化,举个例 子:如果人是一个 class,那么我们中的每一个都是人这个类的具体的 instance,如果人这个类只有一个状态

13、就是生身父母,那么它就是一个不变类, 因为每一个人在出生的那一刹那,生身父母就已经被设置了值,而且终生都不会 发生变化。 不变类有什么好处呢? 1) 不变类是线程安全的,由于不变类的状态在创建以后不再发生变化,所以 它可以在线程之间共享,而不需要同步。 2) 不变类的 instance 可以被 reuse 创建类的实例需要耗费 CPU 的时间, 当这个实例不再被引用时,将会被垃圾回收 掉,这时候,又需要耗费 CPU 的时间。对于不变类而言,一个好处就是可以将常 用的实例进行缓存,从而减少了对象的创建。举个例子,对于布尔型,最常用的 便是 true and false。JDK 中的 Boolea

14、n 类就是一个不变类,并且对这两个实例 进行了缓冲。 public final class Boolean implements java.io.Serializable /* * The Boolean object corresponding to the primitive * value true. */ public static final Boolean TRUE = new Boolean(true); /* * The Boolean object corresponding to the primitive * value false. */ public static f

15、inal Boolean FALSE = new Boolean(false); / 这个方法不会创建新的对象,而是重用已经创建好的 instance public static Boolean valueOf(boolean b) return (b ? TRUE : FALSE); 3) 不变类的某些方法可以缓存计算的结果 hashCode 这个方法来自于 Object 这个类,这个方法用来返回对象的 hashCode, 主要用于将对象放置到 hashtable 中时,来确定这个对象的存储位置。对于一个 不变类的实例,它的 hashCode 也是不变的,所以就可以缓存这个计算的结果, 来提

16、高性能,避免不必要的运算,JDK 中的 String 类就是一个例子。 public final class String /* Cache the hash code for the string */ private int hash; / Default to 0 public int hashCode() int h = hash; if (h = 0) / compute the value hash = h; / cache the value return h; 在 JDK 中, String, the primitive wrapper classes, and BigInteger and BigDecimal 都是不变类。 如果一个类是不变类,这个类是不是就不能有改变状态的方法呢? 答案当然是否定的,Stri

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 经营企划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号