JAVA面试题 第五弹

打印 上一主题 下一主题

主题 649|帖子 649|积分 1957

1、Java中垃圾收集的方法有哪些
采用分区分代回收思想:
复制算法  年轻代中使用的是Minor GC,这种GC算法采用的是复制算法(Copying)
a) 效率高,缺点:需要内存容量大,比较耗内存
b) 使用在占空间比较小、革新次数多的新生区
标记-扫除  老年代一般是由标记扫除大概是标记扫除与标记整理的混合实现
a) 效率比较低,会差生碎片。
标记-整理  老年代一般是由标记扫除大概是标记扫除与标记整理的混合实现
a) 效率低速率慢,需要移动对象,但不会产生碎片。
2、怎样判断一个对象是否存活(大概GC对象的判断方法)
引用计数法
所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.
引用计数法有一个缺陷就是无法解决循环引用标题,也就是说当对象A引用对象B,对象B又引用者对象A,那么此时A,B对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。
可达性算法(引用链法)
该算法的基本思路就是通过一些被称为引用链(GC Roots)的对象作为出发点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。
在java中可以作为GC Roots的对象有以下几种:虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地方法栈JNI引用的对象。
3、什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查
引发 StackOverFlowError 的常见原因有以下几种
无限递归循环调用(最常见)
实行了大量方法,导致线程栈空间耗尽
方法内声明了海量的局部变量
native 代码有栈上分配的逻辑,并且要求的内存还不小,比如 java.net.SocketInputStream.read0 会在栈上要求分配一个 64KB 的缓存(64位 Linux)。
引发 OutOfMemoryError的常见原因有以下几种
内存中加载的数据量过于庞大,如一次从数据库取出过多数据
聚集类中有对对象的引用,使用完后未清空,使得JVM不能回收
代码中存在死循环或循环产生过多重复的对象实体
启动参数内存值设定的过小
排查:可以通过jvisualvm举行内存快照分析
4、为什么要使用线程池
线程池做的工作主要是控制运行的线程数量,处置惩罚过程中将使命放入队列,然后在线程创建后启动这些使命,如果线程数量超过了最 大数量,超出数量的线程排队等待,等别的线程实行完毕,再从队列中取出使命来实行。
主要特点:线程复用;控制最大并发数:管理线程。
第一:降低资源斲丧。通过重复使用己创建的线程降低线程创建和销毁造成的斲丧。
第二:提高响应速率。当使命到达时,使命可以不需要的比及线程创建就能立即实行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限定的创建,不仅会斲丧系统资源,还会降低系统的稳固性,使用线程池可以进 行同一的分配,调优和监控
5、常见线程安全的并发容器有哪些
CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap
CopyOnWriteArrayList、CopyOnWriteArraySet采用写时复制实现线程安全
ConcurrentHashMap采用分段锁的方式实现线程安全

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表