本帖最后由 逆风TO 于 2018-7-25 11:52 编辑
公司名称:西安中软国际
公司地址:西安高新区区天谷八路和云水一路
公司规模:1000以上, 上市公司
主要业务:关于语音识别,身份证识别,一系列的服务.
面试前话
按照套路自我感觉面试就是在装~, 你们懂的. 谁能真正的在短短一两个小时,探究出你有多牛逼呢. 要想在面试官面前展示自己的吊,全靠一张嘴. 好废话不多说,我们开始面试了啊.
笔试环节
来到到公司前台,和柜台小姐姐打声招呼. 直接安排去笔试. 进去一看已经有好几个兄弟埋头苦做呢.好我也加入.
首先这个笔试题不是说要做的非常非常好,一般笔试题都是最基本的基础,或者逻辑思维题. 我们尽量做,要觉得不是很满意,告诉大家有个秘诀,团结就是力量,把你们遇到的笔试题分享到班级群里,大家相互帮助,你帮我,我帮你,对不对.
各自做完,就交卷了. 在我之前透过门缝看到前一个哥们刚交了以后不久就走了.我想他是回家了. 又少一个对手.暗喜.
面试环节( 正真展示自己嘴皮功夫的时候到了)
首先和面试官闲聊几句,大概介绍下自己(自然自信点).
1.你上家公司为什么使用ElasticSearch所有引擎
ElasticSearch(简称ES)是一款分布式且高可扩展的全文搜索和分析引擎,本身是基于Lucene进行开发, 同类的应该还有Solr,Hibernate Search等, 但ES非常简单易用,而且还提供丰富的API,部署容易。
2.说说你对ElasticSearch的节点,索引,类型,文档 理解.
节点(Node):节点是集群中的单个Server,可以存储数据,并提供索引和查询服务。同集群一样,节点也会用字符串来标识自己, 若局域网内多个节点以相同的集群名称配置启动,将会自动形成一个集群.
索引(Index): 索引就是一些具有相似属性的文档集合。一个索引也通过名称来唯一标识,可以类比为数据库中的Scheme。
类型(Type): 类型就是文档所属的类,可以类比为数据库中的表。
文档(Document): 文档是索引信息的基本单位,并以JSON格式进行表示。
3.谈谈Mybatis事务管理.
Mybatis通过内部的Transaction和TransactionFactory来管理事务。Mybatis将事务抽象为Transaction,通过管理内部的JDBC的Connection对象来完成事务管理。Mybatis内部有两个具体的事务实现: JdbcTransaction和ManagedTransaction。JdbcTransaction使用JDBC的Connection对象的提交和回滚来管理事务,并通过内部的 DataSource对象来获取Connection对象。
4.OOM你遇到过哪些情况?你是怎么搞定的?
a. OutOfMemoryError异常Java Heap 溢出
一般的异常信息:java.lang.OutOfMemoryError:Java heap spacess, java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常。
出现这种异常,一般手段是先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump出来的堆转存快照进行分析,重点是确认内存中的对象是否是必要的,先分清是因为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄漏对象时通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。
如果不存在泄漏,那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。
b. 虚拟机栈和本地方法栈溢出
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常
这里需要注意当栈的大小越大可分配的线程数就越少。
c. 运行时常量池溢出
异常信息:java.lang.OutOfMemoryError:PermGen space
如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。
d. 方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。
异常信息:java.lang.OutOfMemoryError:PermGen space
方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。
5.synchronized 和 ReentrantLock 有什么不同
a.这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。
b.Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
c. ReentrantLock由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。
6.Error 和 Exception有什么区别
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
7.什么是 异常链
a.常常会再捕获一个异常后跑出另外一个异常,并且希望把异常原始信息保存下来,这被称为异常链。
b.在JDK1.4以前,程序员必须自己编写代码来保存原始异常信息,
c.现在所有Throwable的子类子构造器中都可以接受一个cause对象作为参数,这个cause就异常原由,代表着原始异常,即使在当前位置创建并抛出行的异常,也可以通过这个cause追踪到异常最初发生的位置。
d.Throwable类及其所有的子类都提供了带cause参数的构造器,其他的异常类就只有通过initCause()来设置cause了。
总结
此次面试问的问题有深有浅,不管怎样都要冷静,会的尽量多说,不太懂得知道多少说多少. 要按照自己的想法去说,不要支支吾吾.要把自己的自然自信展示出来. 还有一点要和面试官保持互动, 避免一问一答很冷的场面. 还要有礼貌哦.
|