技术面面试总结2


java类加载过程

一个java类从字节码到能够在jvm中被使用,需要经过加载、链接和初始化这三个步骤。

(1)java类的加载

java类的加载是由类加载器来完成的。一般来说,类加载器分为启动类加载器,扩展类加载器、应用程序类加载器和用户自定义类加载器。Java的类加载采用双亲委派模型,双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。双亲委派模型的优点是:系统类防止内存中出现多份同样的字节码;保证Java程序安全稳定运行。

类加载有三种方式:

1、命令行启动应用时候由JVM初始化加载

2、通过Class.forName()方法动态加载

3、通过ClassLoader.loadClass()方法动态加载

(2)java类的链接

Java类的链接指的是将java类的二进制代码合并到JVM运行状态之中的过程。类的链接过程包括验证、准备和解析步骤。

验证是用来确保Java类的二进制表示在结构上是完全正确的。

准备过程则是创建Java类中的静态域,并将这些域的值设为默认值。准备过程并不会执行代码。

在一个Java类中会包含对其它类或接口的形式引用,包括它的父类、所实现的接口、方法的形式参数和返回值的Java类等。解析的过程就是确保这些被引用的类能被正确的找到。解析的过程可能会导致其它的Java类被加载。

(3)java类的初始化

当一个Java类第一次被真正使用到的时候,JVM会进行该类的初始化操作。初始化过程的主要操作是执行静态代码块和初始化静态域。在一个类被初始化之前,它的直接父类也需要被初始化。但是,一个接口的初始化,不会引起其父接口的初始化。在初始化的时候,会按照源代码中从上到下的顺序依次执行静态代码块和初始化静态域。

1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。

2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

3.父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。

4.执行父类的构造方法。

5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

6.执行子类的构造方法。

java的GC原理

自动的垃圾回收机制是java语言的一个特点,开发人员无需手动释放系统资源,减少了开发人员的工作量。

引用计数法 (ReferenceCounting)

引用计数器的实现很简单,对于一个对象 A,只要有任何一个对象引用了 A,则 A 的引用计数器就加 1,当引用失效时,引用计数器就减 1。只要对象 A 的引用计数器的值为 0,则对象 A 就不可能再被使用。

标记-清除算法 (Mark-Sweep)

标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段首先通过根节点,标记所有从根节点开始的较大对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。该算法最大的问题是存在大量的空间碎片,因为回收后的空间是不连续的。在对象的堆空间分配过程中,尤其是大对象的内存分配,不连续的内存空间的工作效率要低于连续的空间。

复制算法 (Copying)

将现有的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大。因此在真正需要垃圾回收的时刻,复制算法的效率是很高的。又由于对象在垃圾回收过程中统一被复制到新的内存空间中,因此,可确保回收后的内存空间是没有碎片的。该算法的缺点是将系统内存折半。

标记-压缩算法 (Mark-Compact)

复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在年轻代经常发生,但是在老年代更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活的对象较多,复制的成本也将很高。

标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。也首先需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。

增量算法 (IncrementalCollecting)

在垃圾回收过程中,应用软件将处于一种 CPU 消耗很高的状态。在这种 CPU 消耗很高的状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。

增量算法的基本思想是,如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。

分代 (GenerationalCollecting)

根据垃圾回收对象的特性,不同阶段最优的方式是使用合适的算法用于本阶段的垃圾回收,分代算法即是基于这种思想,它将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率。以 Hot Spot 虚拟机为例,它将所有的新建对象都放入称为年轻代的内存区域,年轻代的特点是对象会很快回收,因此,在年轻代就选择效率较高的复制算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老生代的内存空间。在老生代中,几乎所有的对象都是经过几次垃圾回收后依然得以幸存的。因此,可以认为这些对象在一段时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。如果依然使用复制算法回收老生代,将需要复制大量对象。再加上老生代的回收性价比也要低于新生代,因此这种做法也是不可取的。根据分代的思想,可以对老年代的回收使用与新生代不同的标记-压缩算法,以提高垃圾回收效率。

线程和进程的区别

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

Linux常用命令chmod、ps|grep

(1)     文件/目录命令

新解文件命令:touch、vi

查看文件内容:vi、cat、more、less、tac、tall

查找文件:find、switch、locate、whereis

删除文件:rm

移动文件:mv

复制文件:cp

创建目录:mkdir

删除目录:rmdir(只能删除空目录),rm  -r 删除目录及其子目录

修改文件权限:chmod(chmod u+x g+w,o+r 文件名称)

(2)     网络命令

查看网络配置:ifconfig

查看网络状态:netstat

IP与主机名的检查:nslookup、host

访问远程主机:telnet

将数据包发送指定用户地址:ping

显示主机名:hostname

打印路由器中的路由转发表:route

(3)     进程命令

查看进程:ps、top

查看进程所有的数据:ps –aux

(4)     Ubuntu中安装/卸载软件命令

安装软件:sudo  apt-get install 软件名称

浏览已安装软件:sudo –list

卸载程序及其所有配置文件:sudo apt-get –purge remove 软件名称

只卸载程序,保留配置文件:sudo apt-get remove 软件名称

(5)      

怎样在windows和Linux下查看路由表

Windows用routeprint 打印路由表信息

Linux下用netstat –r或者是route

Ping命令发出后用到了哪些协议

(1)    ICMP发送请求数据报

(2)    由ICMP协议打包这个数据包和IP地址“&&&”转交给IP层协议;IP层协议将地址“&&&”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包。

(3)    得到目的IP地址的MAC地址(如果在同一个网络,通过ARP协议,否则)

其他网页都能打开的前提下,百度网页打不开的原因(域名解析错误)

DNS欺骗

DNS欺骗是这样一种中间人攻击形式,它是攻击者冒充域名服务器的一种欺骗行为,它主要用于向主机提供错误DNS信息,当用户尝试浏览网页,例如IP地址为XXX.XX.XX.XX,网址为www.bankofamerica.com,而实际上登录的确实IP地址YYY.YY.YY.YY上的www.bankofamerica.com,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这个网址是攻击者用以窃取网上银行登录证书以及帐号信息的假冒网址,DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。整个操作过程其实非常简单。

如何抵御这种攻击:

保护内部设备:像这样的攻击大多数都是从网络内部执行攻击的,如果你的网络设备很安全,那么那些感染的主机就很难向你的设备发动欺骗攻击。

不要依赖DNS:在高度敏感和安全的系统,你通常不会在这些系统上浏览网页,最后不要使用DNS。如果你有软件依赖于主机名来运行,那么可以在设备主机文件里手动指定。

使用入侵检测系统:只要正确部署和配置,使用入侵检测系统就可以检测出大部分形式的ARP缓存中毒攻击和DNS欺骗攻击。

使用DNSSEC: DNSSEC是替代DNS的更好选择,它使用的是数字前面DNS记录来确保查询响应的有效性,DNSSEC现在还没有广泛运用,但是已被公认为是DNS的未来方向,也正是如此,美国国防部已经要求所有MIL和GOV域名都必须开始使用DNSSEC。

TCP连接和释放过程

TCP和UDP的区别

论文中的算法

SQL语句

Windows的目录文件系统

FAT 概述

FAT 是迄今 WindowsNT 支持的最简单的文件系统。FAT 文件系统的特点在于文件分配表(FAT),这是一个真正的表,它位于卷的最“顶端”。为了保护卷,最好保留两份 FAT 副本,以防其中之一损坏。此外,两个 FAT 表和根目录必须存储在一个固定位置,以方便正确找到系统的启动文件。

使用 FAT 格式化的磁盘以簇为单位进行分配,簇的大小由卷的大小决定。当一个文件被创建时,在目录中就会创建一项,而包含数据的第一个簇号也会建立。FAT 表中的该项或者指示这是文件的最后一个簇,或者指向下一个簇。

更新 FAT 表非常重要,但也相当耗时。不定期更新 FAT 表会导致数据丢失。而费时的原因在于,每次更新 FAT 表时,磁盘读取头都必须重新回到驱动器的 0 逻辑磁道处。

FAT 目录结构没有组织,而且赋予文件的是驱动器上的第一个打开位置。此外,FAT 只支持只读、隐藏、系统和存档文件属性。

FAT 的优点

不能在 Windows NT 下的任何一种受支持的文件系统上执行撤消删除操作。撤消删除实用工具试图直接访问硬件,这在 Windows NT 下是不可行的。但是,如果文件位于 FAT 分区,并且系统重新启动为 MS-DOS 模式,就可以撤消删除文件。FAT只需极少的开销就可以启动,因此,FAT 文件系统最适用于大约200 MB 以下的驱动器和/或分区。

缺点:使用超过 200 MB 的驱动器或分区时,还是不要使用 FAT 文件系统。这是因为当卷容量增大时,FAT 的性能会快速降低。您无法对FAT 分区的文件设置权限。

在 Windows NT 下,FAT 分区大小的上限为 4 GB,在 MS-DOS 中为 2 GB。

HPFS

文件系统最早是随 OS/2 1.2 引入的,目的是提高访问当时市场上出现的更大硬盘的能力。此外,当时也需要一个新的可以扩展命名系统、组织性和安全性的文件系统,以便满足网络服务器市场日益增长的需求。HPFS 保留了 FAT 的目录组织,同时增加了基于文件名的自动目录排序功能。文件名扩展到最多可为 254 个双字节字符。HPFS还允许由“数据”和特殊属性组成文件,从而在支持其他命名规则和安全性方面增加了灵活性。此外,分配单位也从簇改为物理扇区(512 字节),这减少了磁盘空间的浪费。

在 HPFS 下,目录项包含的信息比在 FAT 下更多。至于属性文件,则还包括有关修改、创建、访问日期和时间的信息。在 HPFS 下,目录项不是指向文件的第一个簇,而是指向 FNODE。FNODE 可以包含文件的数据、指向文件的数据的指针或其他最终指向文件的数据的结构。

HPFS 试图将一个文件尽可能分配在连续的扇区内。这样做是为了提高连续处理文件的速度。

HPFS 将一个驱动器组织成一系列的8 MB 频带,并且只要有可能文件就包含在其中一个频带中。频带与频带之间为 2K 的分配位图,用来跟踪一个频带内哪些扇区已分配,哪些扇区尚未分配。分频带可以提高性能,原因是驱动器头不必回到磁盘的逻辑顶部(通常是 0 柱面),而只需回到最近的频带分配位图就可以判断文件的存储位置。

此外,HPFS 还包括两个唯一的特殊数据对象:

超级块

超级块位于逻辑扇区 16 处,它包含一个指向根目录的 FNODE 的指针。使用 HPFS的最大风险之一是,如果因坏扇区导致超级块丢失或损坏,分区的内容也会损坏,即使驱动器的其余部分都很好。通过将所有内容复制到另一个具有好的扇区 16 的驱动器上并重建超级块的办法,有可能恢复驱动器上的数据。但是,这是一个非常复杂的任务。

备用块备用块位于逻辑扇区 17 处,它包含一个“修复”表和备用目录块。在 HPFS 下,当检测到一个坏扇区时,“修复”项即被用来逻辑地指向一个现有的好扇区来替代坏扇区。这种处理写入错误的技术称为修复。

所谓修复技术,就是在因坏扇区导致发生错误时,文件系统会将信息移到另一个扇区中,同时将原来的扇区标记为坏扇区。这些过程对于所有正在执行磁盘 I/O 操作的应用程序而言都是透明的(也就是说,应用程序完全不知道硬盘出过问题)。使用支持修复的文件系统可以消除像 FAT 遇到坏扇区时出现的“Abort,Retry, or Fail?”这样的错误信息。

HPFS 的优点

HPFS 最适用于200-400 MB 范围的驱动器。

HPFS 的缺点

由于 HPFS 带来的系统开销,因此,大约 200 MB 以下的卷最好不要选择使用此文件系统。此外,对于大约 400 MB 以上的卷,使用此文件系统会出现性能下降。

NTFS 概述

从用户的视角来看,NTFS 继续将文件组织成目录,目录也像在 HPFS 中一样被排序。但是,与FAT 或 HPFS 不同的是,NTFS 在磁盘上没有“特殊”对象,而且对诸如 512 字节扇区之类的基础硬件也没有依赖性。此外,磁盘上没有像 FAT 表或 HPFS 超级块这样的特殊位置。

NTFS 主要是提供:

•     可靠性,高端系统和文件服务器尤其需要这一点

•     用于新增功能的平台

•     支持 POSIX 要求

•     消除 FAT 和 HPFS 文件系统的限制

可靠性

为了确保 NTFS 的可靠性,以下三个主要问题已得到解决:可恢复性、排除致命的单一扇区的故障以及修复。

NTFS 是一个可恢复的文件系统,因为它能跟踪针对文件系统的事务。在 FAT 或 HPFS 上执行 CHKDSK 时,系统会检查目录、分配和文件表中指针的一致性。在 NTFS 下,系统会维护针对这些组件的事务日志,因此,CHKDSK 只需将事务回滚到上一个提交点就可以恢复文件系统中的一致性。

在 FAT 或 HPFS 下,如果文件系统的一个特殊对象所在的扇区发生故障,就会发生单一扇区故障。NTFS 通过两种方式来避免出现这一问题:首先,不使用磁盘上的特殊对象,而是跟踪并保护磁盘上的所有对象。其次,在 NTFS 下保存主文件表的多个副本(数量视卷大小而定)。

优点:NTFS 最适合在大约 400 MB 或更大的卷上使用。这是因为在NTFS 下性能不降低,而 FAT 对于较大的卷则是低效的。

NTFS 的缺点:

小于大约 400 MB 的卷不适合使用NTFS,原因是 NTFS 会带来空间开销。该空间开销的形式为 NTFS 系统文件,通常在 100 MB 分区上至少用掉 4MB 的驱动器空间。

目前 NTFS 不含文件加密。因此,人们可以在 MS-DOS 或其他操作系统下启动,然后使用低级磁盘编辑工具来查看 NTFS 卷上存储的数据。

不能使用 NTFS 文件系统格式化软盘;Windows NT 会使用 FAT 文件系统格式化所有软盘,原因是软盘承担不了 NTFS 带来的开销。

进程间的通信方式

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列( messagequeue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

共享内存(shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

线程间的通信方式

锁机制:包括互斥锁、条件变量、读写锁

互斥锁提供了以排他方式防止数据结构被并发修改的方法。

读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

信号量机制(Semaphore):包括无名线程信号量和命名线程信号量。

信号机制(Signal):类似进程间的信号处理。


展开阅读全文

没有更多推荐了,返回首页