企业面试遇到的问题--2_第1页
企业面试遇到的问题--2_第2页
企业面试遇到的问题--2_第3页
企业面试遇到的问题--2_第4页
企业面试遇到的问题--2_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

企业面试遇到的问题针对就业部提出的企业面试问题汇总,给出的答案。1、你们在数据库上有没有使用垂直分库和水平分库以及读写分离。说说你的理解以及使用场景l 垂直分库按列进行分割,即把一条记录分开多个地方保存,每个子表的行数相同。把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O 次数。其缺点是需要管理冗余列,查询所有数据需要join操作。例如有表T1id name qty-1 p1 102 p2 203 p3 304 p4 40.l 水平分库按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。水平分割通常在下面的情况下使用,应用场景:A 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。B 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。C需要把数据存放到多个介质上。例如法规表law就可以分成两个表activelaw和 inactivelaw。activelaw表中的内容是正生效的法规,是经常使用的,而inactivelaw表则使已经作废的法规,不常被查询。水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。l 总结:垂直分割就是按列进行分割,即把一条记录分开多个地方保存,每个子表的行数相同。例如表T1,可以把id和name放到数据文件p1,把qty放到数据文件p2。水平分割就是按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。像表T1,可以把id为单数的放到数据文件P1,双数的放到数据文件P2。l 读写分离数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。对于大访问量的网站,一般会采用读写分离,比如ebay的读写比率是260:1,也就是大型的电子商务网站的。网上看到说采用读写分离有如下工具:1,oracle的logical standby2, Quest公司的SharePlex3, DSG公司的RealSyncMySQLReplication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力。那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave上。如果每个应用都需要来实现读写分离的算法,一则成本太高,二来如果slave增加更多的机器,应用就要随之修改。明显的,如果在应用和数据库间加一个专门用于实现读写分离的中间层,则整个系统的架构拥有更好的扩展性。MySQLProxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQLProxy是完全透明的,应用则只需要连接到MySQLProxy的监听端口即可。2、请谈谈垂直分库和水平分库以及读写分离会遇到的问题,并提出可行的解决方案垂直分库:按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。 需要解决的问题:跨数据库的事务、jion查询等问题?【需要提供解决方案】水平分库:按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。 需要解决的问题:数据路由、组装?【需要提供解决方案】读写分离:对于时效性不高的数据,可以通过读写分离缓解数据库压力。 需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题?【需要提供解决方案】3、请结合实际应用具体讲解一下单点登录单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。中文名单点登录外文名Single Sign On简称SSO解释企业业务整合的解决方案目录1企业应用集成2技术实现机制3实现应用优势技术实现应用优势l 1企业应用集成通常情况下运维内控审计系统、4A系统都包含此项功能,目的是简化账号登录过程并保护账号和密码安全,对账号进行统一管理。企业应用集成(EAI, Enterprise Application Integration)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还有一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。在信息安全管理中,访问控制(Access Controls)环绕四个过程:Identification;Authentication;Authorization;Accountability。单点登录(Single Sign On)属于Authorization授权系统,除单点登录外还包括:Lightweight Directory Access Protocol 和 Authorization ticket。(Michael E. Whitman (2011)Management Of Information SecurityKennesaw University)l 2技术实现机制当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。l 3实现应用优势技术实现以金万维单点登录为例:如图所示:统一的身份认证系统主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行校验,判断其有效性。整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。l 应用优势单点登录:用户只需登录一次,即可通过单点登录系统(eTrueSSO)访问后台的多个 应用系统,二次登录时无需重新输入用户名和密码4、商品上架怎么审核?具体的审核步骤?是否需要专门的人员做审批?(电商项目老师提供)1、首先学生遇到这种问题可以先反问贵公司是否有上架审核这一岗位职责或者前期业务规划的时候有这一功能,根据这一问题的答案做后续的回答;2、一般公司前期业务规划的时候,是考虑过上架审核的,因为担心会有非法商品或者非法信息出现。但是后期真实运营之后就去掉了该功能。原因如下:a)、该部分工作是特别繁重而且没有技术含量的,特别是商城刚上线之初,大量的sku上架发布,这个工作量就会非常大,导致人员成本升高。b)、可以通过业务约束规避该问题,没必要再设立一个岗位去审核它。如果是B2C,则内部发布商品的运营人员通过岗位培训,必须要知道哪些商品是非法的,哪些信息是非法的,发布商品时需要注意(即发布时也有审核的概念)。如果是B2B2C,则在和商家签订合同时就要有这方面的约束,如果商城发现该商家有非法商品或显示有非法信息,则客服人员可以通过强制下架功能对其制裁(该商品无法再次上架,相当于删除掉了),并从该商家的保证金中扣除相关罚款。c)、即使不考虑上面的原因,那么想设定一个上架审核岗位,怎么设定?管理层的人,没时间去审核。普通员工,做审核功能也有点欠妥。3、当然有些项目可能用户必须要求去做上架审核,那么可以提供批量审核功能,同时要记录审核日志,其中包括审核人、审核意见。商品上架可以参考以下图去说:5、JVM虚拟机有内存泄露怎么解决l java内存管理机制在C+语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。Java语言对内存管理做了自己的优化,这就是垃圾回收机制。Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbagecollection)负责自动回收不再使用的内存。 上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道GC在什么时候回收内存对象,什么样的内存对象会被GC认为是“不再使用”的。 Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。 通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被GC回收,哪怕是Java虚拟机抛出OutOfMemoryError。l Java内存泄露 一般来说内存泄漏有两种情况。一种情况如在C/C+语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。可能光说概念太抽象了,大家可以看一下这样的例子:Vectorv=newVector(10);for(inti=1;i100;i+) Objecto=newObject(); v.add(o); o=null;在这个例子中,代码栈中存在Vector对象的引用v和Object对象的引用o。在For循环中,我们不断的生成新的对象,然后将其添加到Vector对象中,之后将o引用置空。问题是当o引用被置空后,如果发生GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC在跟踪代码栈中的引用时,会发现v引用,而继续往下跟踪,就会发现v引用指向的内存空间中又存在指向Object对象的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引用,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之后,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。 尽管对于C/C+中的内存泄露情况来说,Java内存泄露导致的破坏性小,除了少数情况会出现程序崩溃的情况外,大多数情况下程序仍然能正常运行。但是,在移动设备对于内存和CPU都有较严格的限制的情况下,Java的内存溢出会导致程序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出OutOfMemoryError,导致程序崩溃。l 一般情况下内存泄漏的避免 在不涉及复杂数据结构的一般情况下,Java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。例如:1publicclassFileSearch23privatebytecontent;4privateFilemFile;56publicFileSearch(Filefile)7mFile=file;8910publicbooleanhasString(Stringstr)11intsize=getFileSize(mFile);12content=newbytesize;13loadFile(mFile,content);1415Strings=newString(content);16returns.contains(str);1718 在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。要避免这种情况下的内存泄露,要求我们以C/C+的内存管理思维来管理自己分配的内存。第一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为local变量,与类实例生命周期相同的要声明为实例变量以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。复杂数据结构中的内存泄露问题在 实际的项目中,我们经常用到一些较为复杂的数据结构用于缓存程序运行过程中需要的数据信息。有时,由于数据结构过于复杂,或者我们存在一些特殊的需求(例 如,在内存允许的情况下,尽可能多的缓存信息来提高程序的运行速度等情况),我们很难对数据结构中数据的生命周期作出明确的界定。这个时候,我们可以使用Java中一种特殊的机制来达到防止内存泄露的目的。之前我们介绍过,Java的GC机制是建立在跟踪内存的引用机制上的。而在此之前,我们所使用的引用都只是定义一个“Objecto;”这样形式的。事实上,这只是Java引用机制中的一种默认情况,除此之外,还有其他的一些引用方式。通过使用这些特殊的引用机制,配合GC机制,就可以达到一些我们需要的效果。Java中的几种引用方式Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用。下面,我们首先详细地了解下这几种引用方式的意义。 强引用在此之前我们介绍的内容中所使用的引用都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。软引用(SoftReference)SoftReference类的一个典型用途就是用于内存敏感的高速缓存。SoftReference的原理是:在保持对对象的引用时保证在JVM报告内存不足情况之前将清除所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法以及垃圾收集器运行时可用的内存数量。弱引用(WeakReference)WeakReference类的一个典型用途就是规范化映射(canonicalizedmapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放WeakReference引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。虚引用(PhantomReference)PhantomReference类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行pre-mortem清除操作。PhantomReference必须与ReferenceQueue类一起使用。需要ReferenceQueue是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时,PhantomReference对象就被放在它的ReferenceQueue上。将PhantomReference对象放在ReferenceQueue上也就是一个通知,表明PhantomReference对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。Reference与ReferenceQueue的配合使用。GC、Reference与ReferenceQueue的交互A、GC无法删除存在强引用的对象的内存。B、GC发现一个只有软引用的对象内存,那么:SoftReference对象的referent域被设置为null,从而使该对象不再引用heap对象。SoftReference引用过的heap对象被声明为finalizable。当heap对象的finalize()方法被运行而且该对象占用的内存被释放,SoftReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。C、GC发现一个只有弱引用的对象内存,那么:WeakReference对象的referent域被设置为null,从而使该对象不再引用heap对象。WeakReference引用过的heap对象被声明为finalizable。当heap对象的finalize()方法被运行而且该对象占用的内存被释放时,WeakReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。D、GC发现一个只有虚引用的对象内存,那么:PhantomReference引用过的heap对象被声明为finalizable。PhantomReference在堆对象被释放之前就被添加到它的ReferenceQueue。值得注意的地方有以下几点:1、GC在一般情况下不会发现软引用的内存对象,只有在内存明显不足的时候才会发现并释放软引用对象的内存。2、GC对弱引用的发现和释放也不是立即的,有时需要重复几次GC,才会发现并释放弱引用的内存对象。3、软引用和弱引用在添加到ReferenceQueue的时候,其指向真实内存的引用已经被置为空了,相关的内存也已经被释放掉了。而虚引用在添加到ReferenceQueue的时候,内存还没有释放,仍然可以对其进行访问。代码示例通过以上的介绍,相信您对Java的引用机制以及几种引用方式的异同已经有了一定了解。光是概念,可能过于抽象,下面我们通过一个例子来演示如何在代码中使用Reference机制。1Stringstr=newString(hello);/2ReferenceQueuerq=newReferenceQueue();/3WeakReferencewf=newWeakReference(str,rq);/4str=null;/取消hello对象的强引用5Stringstr1=wf.get();/假如hello对象没有被回收,str1引用hello对象6/假如hello对象没有被回收,rq.poll()返回null7Referenceref=rq.poll();/在以上代码中,注意两处地方。假如“hello”对象没有被回收wf.get()将返回“hello”字符串对象,rq.poll()返回null;而加入“hello”对象已经被回收了,那么wf.get()返回null,rq.poll()返回Reference对象,但是此Reference对象中已经没有str对象的引用了(PhantomReference则与WeakReference、SoftReference不同)。引用机制与复杂数据结构的联合应用了解了GC机制、引用机制,并配合上ReferenceQueue,我们就可以实现一些防止内存溢出的复杂数据类型。例如,SoftReference具有构建Cache系统的特质,因此我们可以结合哈希表实现一个简单的缓存系统。这样既能保证能够尽可能多的缓存信息,又可以保证Java虚拟机不会因为内存泄露而抛出OutOfMemoryError。这种缓存机制特别适合于内存对象生命周期长,且生成内存对象的耗时比较长的情况,例如缓存列表封面图片等。对于一些生命周期较长,但是生成内存对象开销不大的情况,使用WeakReference能够达到更好的内存管理的效果。附SoftHashmap的源码一份,相信看过之后,大家会对Reference机制的应用有更深入的理解。1packagecom.*.widget;23/:SoftHashMap.java4importjava.util.*;5importjava.lang.ref.*;67importandroid.util.Log;89publicclassSoftHashMapextendsAbstractMap10/*TheinternalHashMapthatwillholdtheSoftReference.*/11privatefinalMaphash=newHashMap();12/*Thenumberofhardreferencestoholdinternally.*/13privatefinalintHARD_SIZE;14/*TheFIFOlistofhardreferences,orderoflastaccess.*/15privatefinalLinkedListhardCache=newLinkedList();16/*ReferencequeueforclearedSoftReferenceobjects.*/17privateReferenceQueuequeue=newReferenceQueue();1819/StrongReferencenumber20publicSoftHashMap()this(100);21publicSoftHashMap(inthardSize)HARD_SIZE=hardSize;222324publicObjectget(Objectkey)25Objectresult=null;26/WegettheSoftReferencerepresentedbythatkey27SoftReferencesoft_ref=(SoftReference)hash.get(key);28if(soft_ref!=null)29/FromtheSoftReferencewegetthevalue,whichcanbe30/nullifitwasnotinthemap,oritwasremovedin31/theprocessQueue()methoddefinedbelow32result=soft_ref.get();33if(result=null)34/Ifthevaluehasbeengarbagecollected,removethe35/entryfromtheHashMap.36hash.remove(key);37else38/Wenowaddthisobjecttothebeginningofthehard39/referencequeue.Onereferencecanoccurmorethan40/once,becauselookupsoftheFIFOqueueareslow,so41/wedontwanttosearchthroughiteachtimetoremove42/duplicates.43/keeprecentuseobjectinmemory44hardCache.addFirst(result);45if(hardCache.size()HARD_SIZE)46/RemovethelastentryiflistlongerthanHARD_SIZE47hardCache.removeLast();48495051returnresult;525354/*WedefineourownsubclassofSoftReferencewhichcontains55notonlythevaluebutalsothekeytomakeiteasiertofind56theentryintheHashMapafteritsbeengarbagecollected.*/57privatestaticclassSoftValueextendsSoftReference58privatefinalObjectkey;/alwaysmakedatamemberfinal59/*Didyouknowthatanouterclasscanaccessprivatedata60membersandmethodsofaninnerclass?Ididntknowthat!61Ithoughtitwasonlytheinnerclasswhocouldaccessthe62outerclasssprivateinformation.Anouterclasscanalso63accessprivatemembersofaninnerclassinsideitsinner64class.*/65privateSoftValue(Objectk,Objectkey,ReferenceQueueq)66super(k,q);67this.key=key;68697071/*HerewegothroughtheReferenceQueueandremovegarbage72collectedSoftValueobjectsfromtheHashMapbylookingthem73upusingtheSoftValue.keydatamember.*/74publicvoidprocessQueue()75SoftValuesv;76while(sv=(SoftValue)queue.poll()!=null)77if(sv.get()=null)78Log.e(processQueue,null);79else80Log.e(processQueue,Notnull);8182hash.remove(sv.key);/wecanaccessprivatedata!83Log.e(SoftHashMap,release+sv.key);848586/*Hereweputthekey,valuepairintotheHashMapusing87aSoftValueobject.*/88publicObjectput(Objectkey,Objectvalue)89processQueue();/throwoutgarbagecollectedvaluesfirst90Log.e(SoftHashMap,putinto+key);91returnhash.put(key,newSoftValue(value,key,queue);9293publicObjectremove(Objectkey)94processQueue();/throwoutgarbagecollectedvaluesfirst95returnhash.remove(key);9697publicvoidclear()98hardCache.clear();99processQueue();/throwoutgarbagecollectedvalues100hash.clear();101102publicintsize()103processQueue();/throwoutgarbagecollectedvaluesfirst104returnhash.size();105106publicSetentrySet()107/no,no,youmayNOTdothat!GRRR108thrownewUnsupportedOperationException();1091101111121136、JVM是否有深入了解、有什么优化、具体使用场景一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题。在Java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个是给对象赋予了空值null,以后再没有调用过,另一个是给对象赋予了新值,这样重新分配了内存空间。二、Java内存泄露引起原因 首先,什么是内存泄露?经常听人谈起内存泄露,但要问什么是内存泄露,没几个说得清楚。内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。那么,Java内存泄露根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。具体主要有如下几大类: 1、静态集合类引起内存泄露: 像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。 例: 复制代码 代码如下:Static Vector v = new Vector(10);for (int i = 1; i100; i+)Object o = new Object();v.add(o);o = null;/在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。(解决方案)2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。例:复制代码 代码如下:public static void main(String args)Set set = new HashSet();Person p1 = new Person(唐僧,pwd1,25);Person p2 = new Person(孙悟空,pwd2,26);Person p3 = new Person(猪八戒,pwd3,27);set.add(p1);set.add(p2);set.add(p3);System.out.println(总共有:+set.size()+ 个元素!); /结果:总共有:3 个元素!p3.setAge(2); /修改p3的年龄,此时p3元素对应的hashcode值发生改变 set.remove(p3); /此时remove不掉,造成内存泄漏set.add(p3); /重新添加,居然添加成功System.out.println(总共有:+set.size()+ 个元素!); /结果:总共有:4 个元素!for (Person person : set)System.out.println(person);3、监听器 在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。4、各种连接 比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面去的连接,在finally里面释放连接。5、内部类和外部模块等的引用 内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。此外程序员还要小心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如: public void registerMsg(Object b); 这种调用就要非常小心了,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B 是否提供相应的操作去除引用。6、单例模式 不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,考虑下面的例子: 复制代码 代码如下:class Apublic A()B.getInstance().setA(this);./B类采用单例模式class Bprivate A a;private static B instance=new B();public B()public static B getInstance()return instance;public void setA(A a)this.a=a;/getter.显然B采用singleton模式,它持有一个A对象的引用,而这个A类的对象将不能被回收。想象下如果A是个比较复杂的对象或者集合类型会发生什么情况7、spring框架有哪些优化方案、有没有改过源代码?要求学员把spring了解以下:参考:详解Spring框架的设计理念与设计模式.doc可以回答,没有改过,spring框架封装的很完善了,覆盖了企业开发的大部分功能!但是也可以回答:如果使用ssh开发,可以把spring提供的hibernateTemplate改改,支持多种查询!即修改hibernateTemplate操作的API8、hibernate、mybatis框架有哪些

温馨提示

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

评论

0/150

提交评论