java面试一般会问什么
java面试一般会问什么
面试是通过书面或面谈的形式来考察一个人的工作能力与否,物以类聚,通过面试可以初步判断应聘者是否可以融入自己的团队。那么java面试一般会问什么呢?下面是范文网小编给大家整理的java面试一般会问什么,供大家参阅!
java面试一般会问什么
1.java是否会出现内存溢出?如何解决?
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。为了解决Java中内存溢 出问题,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释 放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达 一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。Java的内存 垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。
引起内存溢出的原因有很多种,常见的有以下几种:
l 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
l 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
l 代码中存在死循环或循环产生过多重复的对象实体;
l 使用的第三方软件中的BUG;
l 启动参数内存值设定的过小;
3.内存溢出的解决
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。
第一步,就是修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可 以使用的内存为128MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,- Xms,-Xmx参数一定不要忘记加。
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。在一个项目中,使用两个数据 库连接,其中专用于发送短信的数据库连接使用DBCP连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日 志,一段时间后,就出现“OutOfMemory”错误。经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得 DBCP报“OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。
查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。
第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:
l 检查代码中是否有死循环或递归调用。
l 检查是否有大循环重复产生新对象实体。
l 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中 数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
l 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况。某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。这种情况一般是代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。
原因有很多种,比如:
1.数据量过于庞大;死循环 ;静态变量和静态方法过多;递归;无法确定是否被引用的对象;
2.虚拟机不回收内存(内存泄漏);
说白了就是程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了。 内存溢出的问题要看业务和系统大小而定,对于某些系统可能内存溢出不常见,但某些系统还是很常见的解决的方法,
一个是优化程序代码,如果业务庞大,逻辑复杂,尽量减少全局变量的引用,让程序使用完变量的时候释放该引用能够让垃圾回收器回收,释放资源。
二就是物理解决,增大物理内存,然后通过:-Xms256m -Xmx256m -:MaxNewSize=256m -:MaxPermSize=256m的修改
2.说说JVM内存组成
简单的说 java中的堆和栈
java把内存分两种:一种是栈内存,另一种是堆内存
1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
2。堆内存用来存放由 new创建的对象和数组
在函数(代码块)中定义一个变量时, java就在栈中为这个变量分配内存空间,当超过变量的作用域后, java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由 java虚拟机的自动垃圾回收器来管理
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活 性。
java 堆分为三个区: New 、 Old 和 Permanent
GC 有两个线程:
新创建的对象被分配到 New 区,当该区被填满时会被 GC 辅助线程移到 Old 区,当 Old 区也填满了会触发 GC 主线程遍历堆内存里的所有对象。 Old 区的大小等于 Xmx 减去 -Xmn
java栈存放
栈调整:参数有 +UseDefaultStackSize -Xss256K,表示每个线程可申请 256k的栈空间
每个线程都有他自己的 Stack
3、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
4、是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
5.JDK和JRE的区别是什么?
Java Development Kit,Java开发包 jre ---Java Runtime Environment java运行环境
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包 (JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行 Java应用程序。
面试的形式
面试有很多形式,依据面试的内容与要求,大致可以分为以下几种:
问题式
由招聘者按照事先拟订的提纲对求职者进行发问,请予回答。其目的在于观察求职者在特殊环境中的表现,考核其知识与业务,判断其解决问题的能力,从而获得有关求职者的第一手资料。
压力式
由招聘者有意识地对求职者施加压力,就某一问题或某一事件作一连串的发问,详细具体且追根问底,直至无以对答。此方式主要观察求职者在特殊压力下的反应、思维敏捷程度及应变能力。
随意式
即招聘者与求职者海阔天空、漫无边际地进行交谈,气氛轻松活跃,无拘无束,招聘者与求职者自由发表言论,各抒己见。此方式的目的为:于闲聊中观察应试者谈吐、举止、知识、能力、气质和风度,对其做全方位的综合素质考察。
情景式
由招聘者事先设定一个情景,提出一个问题或一项计划,请求职者进入角色模拟完成,其目的在于考核其分析问题、解决问题的能力。
综合式
招聘者通过多种方式考察求职者的综合能力和素质,如用外语与其交谈,要求即时作文,或即兴演讲,或要求写一段文字,甚至操作一下计算机等等,以考察其外语水平,文字能力,书法及口才表达等各方面的能力。
以上是根据面试种类所做的大致划分,在实际面试过程中,招聘者可能采取一种或同时采取几种面试方式,也可能就某一方面的问题对求职者进行更广泛更深刻即深层次的考察,其目的在于能够选拔出优秀的应聘者。