• JVM垃圾回收问答


    为什么要有垃圾回收 

    内存资源是有限的,当所需内存不能满足时,需要把不再使用的对象清除掉,否则JVM将无法运行下去

    怎么判断对象是否是垃圾

    判断对象是否是垃圾,有两种方式:1是标记引用计数,2是根部可达,第一种存在环形引用问题,第二种是JVM目前采用的方式

    在根部可达中,哪些对象可以作为根

    1栈中引用的对象,2方法区变量,3方法区常量,4JNDI中引用的对象

    垃圾回收的方式有哪些,以及各自的优缺点

    1复制:适用于大部分对象都不再引用

    2 标记清除:效率相对低,容易产生碎片

    3标记清除整理:效率相对低,不会产生碎片

    4并发标记清除:产生碎片,效率相对高些,减少业务暂停时间

    是不是内存分配的越大,效果就越好

    对于需要减少暂停业务,内存分配的越大,垃圾回收的时间就越长,业务暂停时间就越长

    对于需要充分发挥吞吐量的业务,内存分配的大,垃圾回收时间随长,但整体效率要高

    内存分配是一个不断调整、观察的过程,不是一蹴而就、一成不变的

    为什么要分代

    由于存在大部分对象存活时间都很短,根据不同对象存活时间分割在不通区域,提高回收效率,降低回收时间

    新生代为什么要有Eden、S0、S1,而不采用两个大小一样的内存分配区域

     增加内存空间率用率,减少垃圾回收次数

    有什么途径来优化垃圾回收

    对应用造成卡顿的主要来自于老年代的回收,对程序开发者来说,减少不必要的对象的创建,对于JVM可以使用并行垃圾回收和CMS(并发标记清除)收回器;

    对于非逃逸对象,可以采用栈来进行存储,减少垃圾回收次数;

    对于垃圾回收,还需要进行内存分配参数的调整,这是一个长时间观察和不断改变的过程。

    栈和堆有什么区别

    栈:先进后出,堆:先进先出

    栈:存储在一级缓存或者二级缓存上,堆:存储在内存上

    栈:存储的是cpu要执行的指令和数据,堆:只存储数据

    栈:存储空间较小,价格相对贵一些,堆:存储空间大,价格相对便宜

    为什么不把所有的非逃逸对象分配到栈上

     栈:存储空间较小,价格相对贵一些

  • 相关阅读:
    python笔记第二节
    python笔记第一节
    hadoop 家族生态圈 小结
    JDBC:impala 连接DEMO
    关于excel表格的导入导出的工具类。(java 反射 excel)
    简单写了一个类似全文检索的帮助类。
    关于框架SSM中文乱码问题总结
    关于SpringMVC, bean对象中含有Date型变,改如何接收数据的问题。
    Nlog
    java手动编译
  • 原文地址:https://www.cnblogs.com/lilei2blog/p/9585627.html
Copyright © 2020-2023  润新知