Java⾯试题整理,连续四年百度Java岗必问⾯试题
GC概述
垃圾收集(Garbage Collection)通常被称为“GC”,由虚拟机“⾃动化”完成垃圾回收⼯作。
思考⼀个问题,既然GC会⾃动回收,开发⼈员为什么要学习GC和内存分配呢?为了能够配置上⾯的参数配置?参数配置⼜是为了什么?
“当需要排查各种内存溢出,内存泄露问题时,当垃圾成为系统达到更⾼并发量的瓶颈时,我们就需要对GC的⾃动回收实施必要的监控和调节。”
JVM中程序计数器、虚拟机栈、本地⽅法栈3个区域随线程⽽⽣随线程⽽灭。栈帧随着⽅法的进⼊和退出做⼊栈和出栈操作,实现了⾃动的内存清理。它们的内存分配和回收都具有确定性。
因此,GC垃圾回收主要集中在堆和⽅法区,在程序运⾏期间,这部分内存的分配和使⽤都是动态的。
下⾯通过概念和具体的算法来了解GC垃圾回收的过程。
如何判断对象存活
copytoclipboard什么意思
easyui是什么版本判断对象常规有两种⽅法:引⽤计数算法和可达性分析算法(Reachability Analysis)。
引⽤计数算法:给对象添加⼀个引⽤计数器,每当有⼀个地⽅引⽤它时计数器加1,引⽤释放时计数减1,当计数器为0时可以回收。
引⽤计数算法实现简单,判断⾼效,在微软COM和Python语⾔等被⼴泛使⽤,但在主流的Java虚拟机中没有使⽤该⽅法,主要是因为⽆法解决对象相互循环引⽤的问题。
可达性分析算法:基本思想是通过⼀系列称为“GC Root”的对象(如系统类加载器、栈中的对象、处于激活状态的线程等)作为起点,基于对象引⽤关系,开始向下搜索,所⾛过的路径称为引⽤链,当⼀个对象到GC Root没有任何引⽤链相连,证明对象是不可⽤的。
上图中中绿⾊部分为存活对象,灰⾊部分为可回收对象。虽然灰⾊部分内部依旧有关联,但它们到GC Root是不可达的。
⾯试问题
⾯试官,说说Java GC都⽤了哪些算法?分别应⽤在什么地⽅?
答:复制算法、标记清除、标记整理……
你还在单纯的死记硬背么?继续往下看,你会豁然开朗,再也不⽤死记硬背了。
标记清除算法
标记清除(Mark-Sweep)算法,包含“标记”和“清除”两个阶段:⾸先标记出所有需要回收的对象,在标记完成后统⼀回收掉所有被标记的对象。
标记清除算法是最基础的收集算法,后续的收集算法都是基于该思路并对其缺点进⾏改进⽽得到的。
主要缺点:⼀个是效率问题,标记和清除过程的效率都不⾼;另外是空间问题,标记清除之后会产⽣⼤量不连续的内存碎⽚,空间碎⽚太多可能会导致,当程序在以后的运⾏过程中需要分配较⼤对象时⽆法到⾜够的连续内存⽽不得不提前触发另⼀次垃圾收集动作。
复制算法
复制(Copying)算法:将可⽤内存按容量划分为⼤⼩相等的两块,每次只使⽤其中的⼀块。当⼀块内存⽤完了,就将还存活着的对象复制到另外⼀块上,然后清理掉前⼀块。
每次对半区内存回收时、内存分配时就不⽤考虑内存碎⽚等复杂情况,只要移动堆顶指针,按顺序分
什么是标题栏工具栏菜单栏配内存即可,实现简单,运⾏⾼效。缺点:将内存缩⼩为⼀半,性价⽐低,持续复制长⽣存期的对象则导致效率低下。
JVM堆中新⽣代便采⽤复制算法。回到最初推分配结构图。
在GC回收过程中,当Eden区满时,还存活的对象会被复制到其中⼀个Survivor区;当回收时,会将Eden和使⽤的Survivor区还存活的对象,复制到另外⼀个Survivor区,然后对Eden和⽤过的Survivor区进⾏清理。
如果另外⼀个Survivor区没有⾜够的内存存储时,则会进⼊⽼年代。
这⾥针对哪些对象会进⼊⽼年代有这样的机制:对象每经历⼀次复制,年龄加1,达到晋升年龄阈值后,转移到⽼年代。
在这整个过程中,由于Eden中的对象属于像浮萍⼀样“瞬⽣瞬灭”的对象,所以并不需要1:1的⽐例来分配内存,⽽是采⽤了8:1:1的⽐例来分配。
⽽针对那些像“⽔熊⾍”⼀样,历经多次清理依旧存活的对象,则会进⼊⽼年代,⽽⽼年的清理算法则采⽤下⾯要讲到的“标记整理算法”。
textarea获取内容属性总结
phpmyadmin打开空白谈到⾯试,其实说⽩了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“⾦三银四”的春招,狂刷⼀个⽉的题,狂补超多的漏洞知识,像这次美团⾯试问的算法、数据库、Redis、设计模式等这些题⽬都是我刷到过的
并且我也将⾃⼰刷的题全部整理成了PDF或者Word⽂档(含详细答案解析),
mysql面试题汇总66个Java⾯试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+⼤⼚⾯试题详解(百度,阿⾥,腾讯,华为,迅雷,⽹易,中兴,北京中软等)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论