首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10个经典又容易被人疏忽的JVM面试题

软引用: 一般情况不会回收,如果内存不够要溢出时才会进行回收 弱引用:当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。...虚引用:为一个对象设置虚引用的唯一目的只是为了能在这个对象被回收时收到一个系统的通知。 ❞ 正是因为WeakHashMap使用的是弱引用,「它的对象可能随时被回收」。...什么是指针碰撞?什么是空闲列表?什么是TLAB? ❝一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java虚拟机开始为新生对象分配内存。...❝如果Java堆内存中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,不可以进行指针碰撞啦,虚拟机必须维护一个列表,记录哪些内存是可用的,在分配的时候从列表找到一块大的空间分配给对象实例,...如果一个线程正在给A对象分配内存,指针还没有来的及修改,同时另一个为B对象分配内存的线程,仍引用这之前的指针指向,这就出「问题」了。

66120

10道饿了么JVM面试真题(两轮面试亲身经历)

软引用: 一般情况不会回收,如果内存不够要溢出时才会进行回收弱引用:当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。...虚引用:为一个对象设置虚引用的唯一目的只是为了能在这个对象被回收时收到一个系统的通知。❞ 正是因为WeakHashMap使用的是弱引用,「它的对象可能随时被回收」。...什么是指针碰撞?什么是空闲列表?什么是TLAB? ❝ 一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java虚拟机开始为新生对象分配内存。...from=pc] ❝ 如果Java堆内存中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,不可以进行指针碰撞啦,虚拟机必须维护一个列表,记录哪些内存是可用的,在分配的时候从列表找到一块大的空间分配给对象实例...如果一个线程正在给A对象分配内存,指针还没有来的及修改,同时另一个为B对象分配内存的线程,仍引用这之前的指针指向,这就出「问题」了。

32200
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM常见面试题

    优点:简单高效。 缺点:内存代价高,有效内存为占用内存的一半。...空闲列表(Free List) Java堆中的内存不是规整的,已使用的内存和空闲的内存相互交错,就没有办法简单的进行指针碰撞了。...并发处理 对象创建在虚拟机中时非常频繁的行为,即使是仅仅修改一个指针指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况...>(obj); obj=null; wf.get();//有时会返回null wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾 弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据...4.符号引用验证:符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生。 准备: 准备阶段为变量分配内存并设置类变量的初始化。

    59820

    Android开发笔记(七十五)内存泄漏的处理

    C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区域的首地址赋值给一个指针,这样程序才可操作该指针指向的内存区域。...因为C/C++设计上的原因,手工分配的内存,也要手工来释放,如malloc/free是C中分配/释放内存的运算符,而new/delete则是C++中新增的分配/释放内存的运算符。...为解决该问题,在构造Handler类时就得初始化目标的弱引用,弱引用不同于前面的引用(强引用),弱引用相当于一个指针,指针指向的地址随时可以回收,这又带来一个新问题,就是弱引用指向的对象可能是空的。...幸好这个问题好解决,Handler内部使用目标前先判断以下弱引用是否为空就行了。...既然避免了为Handler分配内存,也就间接避免了内存泄漏。Application的介绍参见《Android开发笔记(二十八)利用Application实现内存读写》。

    1.1K20

    Java后端面试学习知识总结——GC

    标记-复制算法解决了内存碎片化的问题,而且是顺序分配内存,简单高效。 ?...其中,连线表示两个收集器之间可以组合使用,而一些组合(Serial+CMS和ParNew+Parallel Old)在JDK8中被声明废弃,在JDK9中被取消支持。...是Client模式下的JVM默认年轻代垃圾收集器。其垃圾收集逻辑如下图: ? 优点:简单高效,额外内存消耗最小,单/少核心处理器上运行效率高。 缺点:StopTheWorld时间较长。...ZGC也是基于Region堆内存模型,但是ZGC不设分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法,以低延迟为首要目标。...想中断强引用和对象之前的引用关系,可以将引用赋值为null即可,如o = null,此时引用和对象就会断开联系,对象在下次GC就会被回收掉。

    37720

    【编程基础】C语言内存使用的常见问题

    但为求安全性而封装检测机制的做法在某种意义上得不偿失,既不及Java等高级语言的优雅,又损失了C语言的简洁和高效。因此,根本的解决之道还是在于设计和编码的审慎周密。相比事后检测,更应注重事前预防。...二、 栈区内存 1 内存未初始化 未初始化的栈区变量其内容为随机值。直接使用这些变量会导致不可预料的后果,且难以排查。 指针未初始化(野指针)或未有效初始化(如空指针)时非常危险,尤以野指针为甚。...此外,申请动态内存后,必须判断内存是否是为NULL,并进行防错处理,比如使用return语句终止本函数或调用exit(1)终止整个程序的运行。...例如,接口内每次申请比调用者所需更大的内存,将其首尾若干字节设置为特殊值,仅将中间部分的内存返回给调用者使用。这样,通过检查特殊字节是否被改写,即可获知是否发生内存越界。...若该指针还存在多个副本,则必须保证当它所指向的动态内存被释放后,不再使用所有其他副本。 避免上述错误发生的常用方法是释放内存后立即将对应的指针设置为空(NULL)。

    3.4K60

    大厂必问的JVM面试题

    准备 为类变量分配内存并设置类变量初始值的阶段。 解析 虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用用于描述目标,直接引用直接指向目标的地址。...特点:实现简单,运行高效,但可用内存缩小为了原来的一半,浪费空间。...特点:简单高效;内存消耗小;没有线程交互的开销,单线程收集效率高;需暂停所有的工作线程,用户体验不好。...准备 为类变量分配内存并设置类变量初始值的阶段。 解析 虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用用于描述目标,直接引用直接指向目标的地址。...特点:实现简单,运行高效,但可用内存缩小为了原来的一半,浪费空间。

    46011

    Android跨进程通信IPC之4——AndroidIPC基础2

    如果只有一个程序员在维护时,问题通常不大,因为只要稍微留心就可以实现new和delete的配套操作;但是如果一个大型工程(特别是多滴协同研发的软件项目),由于沟通的不及时或者人员素质的残差不起,就很可能会出现动态分配的内存没有回收的情况...解决方案思路如下: 问题1的解决方案:这个简单,只要让指针在创建时设置为null即可 问题2的解决方案:比较复杂,既然是智能指针就为意味着它应该是一个"雷锋",尽可能自动的实现new和delete的相应工作...即当m_ptr不为空时,要先撤销它之前指向的内存对象,然后才能赋予其新值。另外为sp分配一个内存对象,不一定要通过操作运算符(比如等号),它的构造函数也是可以的。...: 在前面讨论之智能指针的"设计理念"时,其实是以强指针为原型逐步还原出智能指针作者的"意图',那么"弱指针"又由什么作用?...为了别面这个问题,我们还规定: 弱指针必须先升级为强指针,才能访问它所指向的目标对象。 所以我们也可以说,若指针的主要使用就是解决循环引用的问题。下面具体看看它和强指针的区别。

    1.3K40

    Java Review (十八、面向对象----对象与垃圾回收)

    Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。...而 Java 堆不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,Java...如果删除①行代码,取消强制垃圾回收 。 再次编译、运行上面程序,将会看到如图四所示的结果 。 图四:调用info()方法时引发空指针异常 ?...()方法,这样 FinalizeTest 的ft类变量将依然保持为 null,这样就导致了空指针异常 。...一个对象是否有虚 引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实 例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一 个系统通知。

    49210

    JVM 垃圾回收机制(GC)总结

    已经不再被使用的对象便视为“已死”,就应该被回收。在Java中,GC只针对于堆内存,Java语言中不存在指针说法,而是叫引用,在堆内存中没有被任何栈内存引用的对象应该被回收。...Serial收集器(复制算法) 新生代单线程收集器,标记和清理都是单线程,优点是简单高效。是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。...:直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配 MaxTenuringThreshold:晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC之后,年龄就增加...默认值为68%,仅在使用CMS收集器时生效 UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理,仅在使用CMS收集器时生效 CMSFullGCsBeforeCompaction...:设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理。

    4K30

    全栈必备 :C语言基础

    register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此register将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的多个指令周期。...在使用内存时,申请与释放要配对,本着谁申请,谁释放的原则,释放后,要把指针置空。...函数调用在程序运行时处理,且要分配内存;宏展开在编译时进行,不分配内存单元,不发生值的传递处理,也不存在返回值 定义时的要求不一样。...使用尖括号引入的头文件在包含文件目录中去查找(包含目录是由用 户在设置环境时设置的),而不在源文件目录去查找。使用双引号则表示首先在当前的源文件目录中查找,若未找到才到所包含目录中去查找。...当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)。

    1.2K30

    Android Native内存泄漏检测方案详解

    ####### 1.1.2.1.3 如何实现指令重定位 我们以一个简单的ARM64汇编代码为例,演示如何进行指令重定位。...在这些重载的函数中,我们可以调用原始的内存管理函数,并在分配内存时将内存块及其相关信息(如分配大小、调用栈等)添加到全局内存分配表中,在释放内存时从全局内存分配表中删除相应的内存块。 b....2.2 代码示例 下面代码的主要技术原理是重写内存管理函数,并使用弱符号引用原始的内存管理函数,以便在每次分配和释放内存时记录相关信息,并能够在程序运行时动态地查找和调用这些函数。...在init_original_functions函数中检查弱符号定义,若未定义则使用dlsym函数查找原始内存管理函数。 全局内存分配表:定义全局内存分配表存储所有分配的内存块及其信息。...在 ARM 下寄存器为 R11。在 ARM64 中寄存器为 X29。ESP:栈指针寄存器,指向栈帧的栈顶 , 在 ARM 下寄存器为 R13。

    7810

    Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机

    对于堆区,其内存结构还有些不一样的地方,先看下图: 简单来说,堆区分为新生代(Young Generation)与老年代(Old Generation),程序在创始对象时,对象会先被分配到新生代中,当新生代区内存不足时...(obj); // 断开强引用,此时只有wf引用这个Object对象 obj = null; // 通用弱引用获取Object对象(可能为null) wf.get(); 在使用wf.get...()时,要判断获取到的对象是否为null,因为弱引用不会阻止对象的回收。...优点:不需要进行对象的移动,仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效。...,会将内存中所有存活对象往左端空闲处移动,并更新对应的指针。

    67420

    jvm之垃圾回收标记相关算法解读

    只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?...例如,在大规模数据存储系统中,引用计数机制可以通过对内存分配和释放的高效控制,提高系统的吞吐量和可扩展性。...标记阶段:可达性分析算法 可达性分析算法(根搜索算法、追踪性垃圾收集) 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题...基本思路 可达性分析算法是以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达。...小技巧:由于Root采用栈方式存放变量和指针,所以如果一个指针,它保存了堆内存里面的对象,但是自己又不存放在堆内存里面,那它就是一个Root。

    23520

    Java垃圾收集器总结

    ,如果回收后内存还不足才会跑出内存溢出异常 弱引用 Weak Reference 通过WeakReference类实现弱引用,弱引用关联的对象只能生存到下一次垃圾收集发生时; 虚引用 Phantom Reference...复制的开销会很大优点: - 实现简单,内存连续,对象分配高效标记整理: 存活对象往内存一端移动, 关注吞吐量 适合有大量存活的对象,比如老年代 - G1的老年代就是基于这种算法的缺点: - 整理时对象可能需要移动...出品(RedHat出品)导致一直被排挤的垃圾收集器; 在OpenJDK中存在但是没有存在于OracleJDK ; 目标: 低停顿 ; 目前RedHat积极扩展其使用范围,将其能够在JDK11甚至JDK8...Region 并发回收: G1在回收阶段虽然可以设置期望停顿时间进行控制,但是依旧是STW的 将回收集中存活的对象复制一份到其他未被使用的Region之中,与用户线程并发时通过转发指针来解决,时间长短取决于回收集的大小初始引用更新...并发标记; 更新染色指针 2. 并发预备重分配: 扫描整个堆得到本次收集过程中要清理的region(重分配集) 3.

    45700

    JVM经典20问!

    准备 为类变量分配内存并设置类变量初始值的阶段。 解析 虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用用于描述目标,直接引用直接指向目标的地址。...//软引用 SoftReference softRef = new SoftReference(str); 弱引用:在进行垃圾回收时,不管当前内存空间足够与否,都会回收只具有弱引用的对象...特点:实现简单,运行高效,但可用内存缩小为了原来的一半,浪费空间。...特点:简单高效;内存消耗小;没有线程交互的开销,单线程收集效率高;需暂停所有的工作线程,用户体验不好。...-Xms1g:初始化堆大小为 1g; -Xmx1g:堆最大内存为 1g; -XX:NewRatio=4:设置新生代和老年代的内存比例为 1:4; -XX:SurvivorRatio=8:设置 Eden

    40010

    Android基础--智能指针

    智能指针分为3类为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Weak Pointer)。轻量级指针采用的是简单的计数,可以认为是强指针的简化版本。...另外一种情况是有多个指针指向了对象A,当某个地方将对象A delete后,操作地方地方的指针,就是对一个非法的内存进行操作 new了对象后没有delete 动态分配内存是需要程序员主动去删除的,不然会造成内存泄漏...,因为会有多个指针指向同一个地址 计数问题 智能指针如何判断对象的内存不在需要呢,在很多领域有引用计数的概念,及当没有指针指向该内存时,就可以认为该内存对象不需要了。...解决的方法就是一个应用采用强指针,另一个采用弱指针,当强指针计数为0时,无论弱指针计数是否为0,都可以delete掉该内存。...对于这个if判断的逻辑,这里我也不是很理解,只能直白地说下字面意思,在增加或减少强指针计数时,会同时整加或减少弱指针计数,而在对弱指针计数的操作则不会同时对强指针计数进行操作,所以 弱指针计数 >=

    1.7K20

    Java 面试高频问题之 JVM

    软引用和弱引用的区别在于:只拥有弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现具有弱引用的对象,则无论当前内存空间是否充足,都会回收它的内存。...优点:按顺序分配内存即可,实现简单、运行高效、不用考虑内存碎片; 缺点:可用内存大小缩小为原来的一半,对象存活率高时将频繁进行复制,效率变低; ?...新生代单线程收集器,标记和清理均为单线程,优点是简单高效。...准备 准备阶段是正式为类变量分配内存同时设置类变量初始值的阶段,这些内存都将在方法区中分配,此时需要注意如下几点: 此时进行内存分配的 仅包括类变量(static),不包括实例变量,实例变量随对象实例化时一块分配在...所谓符号引用,就是用一组符号来描述目标,可以是任何字面量。直接引用 就是 直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

    34521

    Android Native内存泄漏检测方案详解

    ####### 1.1.2.1.3 如何实现指令重定位 我们以一个简单的ARM64汇编代码为例,演示如何进行指令重定位。...在这些重载的函数中,我们可以调用原始的内存管理函数,并在分配内存时将内存块及其相关信息(如分配大小、调用栈等)添加到全局内存分配表中,在释放内存时从全局内存分配表中删除相应的内存块。 b....2.2 代码示例 下面代码的主要技术原理是重写内存管理函数,并使用弱符号引用原始的内存管理函数,以便在每次分配和释放内存时记录相关信息,并能够在程序运行时动态地查找和调用这些函数。...在init_original_functions函数中检查弱符号定义,若未定义则使用dlsym函数查找原始内存管理函数。 全局内存分配表:定义全局内存分配表存储所有分配的内存块及其信息。...在 ARM 下寄存器为 R11。在 ARM64 中寄存器为 X29。ESP:栈指针寄存器,指向栈帧的栈顶 , 在 ARM 下寄存器为 R13。

    73710

    JVM内存模型和垃圾回收机制

    这样的对整个半区进行回收,分配时按照顺序从内存顶端依次分配,这种实现简单,运行高效。不过这种算法将原有的内存空间减少为实际的一半,代价比较高。 ?...引用计数算法 在JDK1.2之前,使用的是引用计数器算法,即当这个类被加载到内存之后,就会产生方法区,堆栈、程序计数器等一系列信息,当创建对象的时候,为这个对象在堆栈空间中分配对象,同时会产生一个引用计数器...弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。...; wf.get();//有时会返回null wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾 弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时...用到的算法为标记-清理、复制算法 G1是区域化的,它将java堆内存划分为若干个大小相同的区域"region“,JVM可以设置每个region的大小(1-32m,大小得看堆内存大小,必须是2的幂),它会根据当前的堆内存分配合理的

    70930
    领券