径点笔试总结

上传人:daj****de 文档编号:188248120 上传时间:2023-02-18 格式:DOCX 页数:10 大小:192.26KB
收藏 版权申诉 举报 下载
径点笔试总结_第1页
第1页 / 共10页
径点笔试总结_第2页
第2页 / 共10页
径点笔试总结_第3页
第3页 / 共10页
资源描述:

《径点笔试总结》由会员分享,可在线阅读,更多相关《径点笔试总结(10页珍藏版)》请在装配图网上搜索。

1、 关于java运行机制1)11仁话言桐程过程2对邻程序r展名为 J QVW )J&m手命码文件愤;居为京田EWindows 下的JaA/m 字书吗解 释程序Linux 卜 的 J anra 字节吗解 释程序程序 |能Javei 字节码 KCPUUendows操住器妹LitlLUX 操作系.蜿Java源码首先转化成中间的字节码文件,扩展名为.class,然后由能够解释java字节码的JVM根据平台的不同解释执行。JVM是存有各种平台的 java字节码解释程序的虚拟机。Java虚拟机机制屏蔽了底层运行平台的差别,真正实现了一次编译,随处运行。 Java运行慢的原因(前三个重点)1) java是解释

2、性语言,需要先编译成字节码,然后由JVM解释执行.而C+编译的时候将程序直接编译成本地机器码。2) java的垃圾回收机制较C+由程序员管理内存效率更低。3) java中所有的对象都创建在堆中,没有对象被创建在stack中,而C+大部分对象和变量是创建在stack中的。4) java中的原始数据类型在每个操作系统平台长度都是相同,而C+这些数据类型长度是随操作系统的不同而不同,所以java在不同操作系统上执 行时有个转化过程.5) 在程序运行过程中,java虚拟机要检测数组是否越界,在C+中则不检测.6) java中采用的是动态链接内存泄漏内存泄露是指在程序中动态分配了内存,但在程序结束时没有

3、释放这部分内存,从而导致这块内存不能被再次使用,我们说这块内存泄漏了; 一般常说的内存泄漏是指堆内存的泄漏。Java虽然具有GC,但是也存在内存泄漏的情况,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。相关知识如下(重点理解如何管 理内存):关于 Java 的内存泄漏 参考资料:问题的提出Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程 序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java 也存在

4、内存泄露,但它的表现与C+不同。随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有 限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。Java是如何管理内存为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员 需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在 Java中,内存的

5、分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了 JVM的 工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、 被引用、赋值等,GC都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程 对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以m

6、ain进程顶点开始的一棵根树。在这个有向图中,根顶点可 达的对象都是有效对象,6。将不回收这些对象。如果某个对象(连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象 不再被引用,可以被GC回收。以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左 边程序运行到第6行的示意图。Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收 它们的。这种方式的优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管

7、理技术是使用计数器,例如COM模型采用计数器方式管理构 件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。什么是Java中的内存泄露下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的, 即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判 定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。在C+中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C+中没有GC,这些内存将永远收

8、不回来。在Java中,这 些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。通过分析,我们得知,对于C+,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式, Java提高了编程的效率。因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C+要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对 象都由GC管理。对于程序员来说,GC基本是透明的,不可见的。虽然,我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定 义,该函数不保证JVM的垃圾收集器

9、一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。JVM 调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通 常来说,我们不需要关心这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的实时系统,如网络游戏等,用户不希 望GC突然中断应用程序执行而进行垃圾回收,那么我们需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如将垃圾回收分解为一系列的 小步骤执行,Sun提供的HotSpot JVM就支持这一特性。下面给出了一个简单的内存泄露的

10、例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本 身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法此时,所有的Object对象都没有被释放,因为变量v引用这些对象。如何检测内存泄漏最后一个重要的问题,就是如何检测Java的内存泄漏。目前,我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查 Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管

11、理的所有信息进行统 计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational公 司的Purify等。下面,我们将简单介绍Optimizeit的基本功能和工作原理。Optimizeit Profiler 版本 4.11 支持 Application,Applet,Servlet 和 Romote Application 四类应用,并且可以支持大多数类型的 JVM,包括 SUN JDK 系 列,IBM的JDK系列,和Jbuilder的JVM等。并且,该软件是由Jav

12、a编写,因此它支持多种操作系统。Optimizeit系列还包括Thread Debugger和 Code Coverage两个工具,分别用于监测运行时的线程状态和代码覆盖面。当设置好所有的参数了,我们就可以在OptimizeIt环境下运行被测程序,在程序运行过程中,Optimizeit可以监视内存的使用曲线(如下图),包括JVM 申请的堆(heap)的大小,和实际使用的内存大小。另外,在运行过程中,我们可以随时暂停程序的运行,甚至强行调用GC,让GC进行内存回收。通 过内存使用曲线,我们可以整体了解程序使用内存的情况。这种监测对于长期运行的应用程序非常有必要,也很容易发现内存泄露。在运行过程中

13、,我们还可以从不同视角观查内存的使用情况,Optimizeit提供了四种方式:堆视角。这是一个全面的视角,我们可以了解堆中的所有的对象信息(数量和种类),并进行统计、排序,过滤。了解相关对象的变化情况。方法视角。通过方法视角,我们可以得知每一种类的对象,都分配在哪些方法中,以及它们的数量。对象视角。给定一个对象,通过对象视角,我们可以显示它的所有出引用和入引用对象,我们可以了解这个对象的所有引用关系。引用图。给定一个根,通过引用图,我们可以显示从该顶点出发的所有出引用。在运行过程中,我们可以随时观察内存的使用情况,通过这种方式,我们可以很快找到那些长期不被释放,并且不再使用的对象。我们通过检查

14、这些 对象的生存周期,确认其是否为内存泄露。在实践当中,寻找内存泄露是一件非常麻烦的事情,它需要程序员对整个程序的代码比较清楚,并且需要 丰富的调试经验,但是这个过程对于很多关键的Java程序都是十分重要的。综上所述,Java也存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。为了解决这些问题,我们可以通过软件工具 来检查内存泄露,检查的主要原理就是暴露出所有堆中的对象,让程序员寻找那些无用但仍被引用的对象。时间复杂度&空间复杂度算法的时间复杂度:算法执行过程中所需要的基本运算次数空间复杂度:算法执行过程中所需要的存储空间,即内存大小多态静态多态性(编译时的多样性静态关联

15、):函数重载:同一层次上的同名函数问题。在程序编译时系统就能决定调用的是哪个函数。(根据参 数个数和类型)动态多态性(运行时的多态性 动态关联):虚函数:不同派生层次上的同名函数问题。在编译时不知道应该调用基类还是派生类的函数,只 有在运行时才能根据指针指向对象的类型决定调用的函数 动态多态性定义:通过继承相关的不同的类,他们的对象能够对同一个函数调用作出不同的响应。一句话,即允许将子类类型的指针赋值给 父类类型的指针,多态性通过虚函数实现。重载&重写重载:一个函数或方法有不同的参数集,这个功能称为重载;同名、不同参数集(包括类型、个数)、不同返回类型重写(覆写):存在面向对象中的继承关系中,

16、子类为满足自己的需要,重新定义某个方法的不同实现;同名、同参、同返回类型 TCP三握手SYN:出现在连接建立时;请求建立连接,发送方的初始序列号ACK:起到应答的作用1、客户机发送一个标志位SYN = 1的TCP段给服务器,等待服务器确认2、服务器收到SYN段后,会发送一个标志位SYN = 1和ACK=1的TCP段给客户机。3、客户机收到SYN-ACK段后,会发送一个SYN=0和ACK=1的TCP段给服务器,连接建立。问题:为什么服务器收到SYN后,确认的同时也要发送SYN段给客户机?答:TCP/IP流服务提供的连接功能是双向的,这种连接叫做全双工连接,故服务器也要请求连接。 TCP四挥手FI

17、N:出现在连接关闭时;要求关闭连接既然是全双工,关闭也要求双向的1、主机A向B发送一个标志位FIN = 1的TCP段,请求关闭2、主机B向A发送一个标志位ACK= 1的TCP段,确认关闭A-B方向的数据传输3、当B发送完数据时,向A发送一个标志位FIN = 1的TCP段,请求关闭4、主机A向B发送一个标志位ACK= 1的TCP段,确认关闭B-A方向的数据传输线程死锁&举例各并发进程在执行过程中因争夺资源而造成的一种互相等待的情况。举例:线程P占有资源S,要求使用资源S,而P占有资源S,要求使用资源S,它们在获得对方的资源之前都不会释放掉自己占有的资源, 112221故死锁。. 二进制文件与文本

18、文件的异同 参考:求同无论是文本文件还是二进制文件的存储在物理上都是二进制的。存异文本文件与二进制文件的区别并不是物理上的,而是逻辑上的;其区别仅仅是编码上不同。. 文本文件(ASCII文件)是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等。二进制文件是基于值编码的文件,可以根据具体应用而自定义编码。.文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些延伸-文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流(前面已经说了,存储都是二进制的),然后按照你所选择的解码方式来解释这 个

19、流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。例 如对于这么一个文件流01000000_01000001_01000010_01000011(下划线_,是我为了增强可读性,而手动添加的),第一个8比特”01000000“ 按ASCII码来解码的话,所对应的字符是字符“A”,同理其它3个8比特可分别解码为“BCD”,即这个文件流可解释成“ABCD,然后记事本就将这 个“ABCDfi示在屏幕上。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然 的一件事情了,解码和译码不对应嘛。其他快排的实现 链表反转Reverse( Node *head ) 二叉树左右指针交换再对树进行复制TreeNode *ReverseCopy(TreeNode *root)Class TreeNode(Int data;TreeNode *left;TreeNode *right;数据库方面:表的创建,表结构(列)的增删,表信息的增删改、排序、求和基本操作

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!