zoukankan      html  css  js  c++  java
  • JVM&NIO&HashMap简单问

     

    JVM&NIO&HashMap简单问

    背景:前几天在网上看到关于JVM&NIO&HashMap的一些连环炮的面试题,整理下以备不时之需。

    一、JVM

    Java的虚拟机的面试内容主要包括GC、类加载机制和内存三大部分。如下是一个一个GC部分简单的连环炮:

    问:

    什么时候一个对象会被GC?

    答:

    当没有任何对象的引用指向该对象时 + 在下次垃圾回收周期来到时,对象才会被回收。

    又问:
    为什么要在这种时候对象才会被GC?

    答:

    因为JVM会自动回收没有被引用的对象来释放空间,从而解决内存不足问题。

    又问:
    GC策略都有哪些分类?

    答:
    1、标记-清除算法。
    2、复制算法。
    3、标记整理算法。

    又问:
    这些策略分别都有什么优势and劣势?都适用于什么场景?

    答:

    1、标记-清除算法采用从根集合进行扫描,对存活的对象进行标记,标记完毕后再扫描整个空间中未被标记的对象,对其进行直接回收。其不需要进行对象的移动,并且仅对不存活的对象进行处理,在存活的对象比较多的情况下极为高效,但由于标记-清除算法只回收不存活的对象,并没有对还存活的对象进行整理,因此会导致内存碎片。

    2、复制算法将内存划分为两个分区,使用此算法时,所有动态分配的对象都只能分配在其中一个区间(活动区间),而另外一个区间(空间区间)则是空闲区间。其采用从根集合扫描,将存活的对象复制到空闲区间,当扫描完毕活动区间后,会将活动区间一次性全部回收,此时原本的空闲区间变成了活动区间,下次GC的时候又会重复刚才的操作,以此循环。另外,复制算法在存活对象比较少的时候,极为高效,但是带来的成本是牺牲一半的内存空间用于进行对象的移动,所以复制算法的使用场景必须是对象的存活率非常低才行,而且最重要的是我们需要克服50%内存的浪费。

    3、标记整理算法采用标记-清除算法一样的方式进行对象的标记、清除,但在回收不存活的对象占用的空间后,会将所有存活的对象往左端空闲空间移动,并更新对应的指针,其算法是在标记-清除算法之上,又进行了对象的移动排序整理,因此成本更高,但却解决了内存碎片的问题。

    4、JVM为了优化内存的回收,采用的是分代回收的方式,对于新生代内存的回收(Minor GC)主要采用复制算法;而对于老年代的回收(Major GC),大多采用标记整理算法。
    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old );新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor;堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。

    二、NIO

    简单介绍下IO包和NIO包中的内容:
    IO包:
    1、按照数据流的方向不同可以分为:输入流(InputStream,Reader)和输出流(OutputStream,Writer)。
    2、按照处理数据单位不同可以分为:字节流(InputStream,OutputStream)和字符流(Reader,Writer)。
    3、按照实现功能不同可以分为:节点流(四大基础流...)和处理流(就是在节点流外面再套一层,比如BufferedReader,BufferedWriter...)。
    注:这里的输入和输出都是针对程序本身而言,而字节和字符就是一个是8位的二进制,另一个是16位的二进制;而节点流和处理流的区别就在于传数据的单位不同。

    NIO:

    首先NIO模型要熟悉,特别是其中的selector一定要非常清楚它的职责和实现原理。其实NIO的核心是IO线程池,一定要记住这个关键点。面试官可能也会问你IO包的设计模式(装饰器模式),为什么要这样设计?
    NIO简介:Non-blocking I/O 或 New I/O;非阻塞IO,作为原始IO的补充,为了应对高性能高并发的应用场景。
    NIO详解:https://blog.csdn.net/qq_28303495/article/details/89514690

    三、Java的数据结构相关的类实现原理

    比如LinkedList,ArrayList,HashMap,TreeMap这一类的,以下简单模拟一个数据结构的连环炮。

    问:

    HashMap是不是有序的?
    答: 
    HashMap是无序集合。

    又问:
    有没有有顺序的Map实现类?
    答:
    TreeMap和LinkedHashMap。

    又问:

    TreeMap和LinkedHashMap是如何保证它的顺序的?
    答:
    LinkedHashMap内部增加了一个链表,用于存放元素的顺序,其是根据元素增加或者访问的先后顺序进行排序的;TreeMap它实现了SortedMap接口,可以对元素进行排序,其是根据元素的Key进行排序的,也就是基于元素的固有顺序(由Comparator或者Comparable确定)。

    又问:
    你觉得它们两个哪个的有序实现比较好?
    答:
    分需求和场景考虑吧:
    TreeMap取出来的是排序后的键值对,如果按自然顺序或自定义顺序遍历键,那么TreeMap会更好;如果需要输出的顺序和输入的顺序形同,那么用LinkedHashMap比较好;

    又问:

    适可而止 见好就收

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    大多云盘都挤兑在了企业级市场
    115能做到100个亿(2016年05月31日),2013营收两亿元
    Dropbox 有哪些鲜为人知的使用技巧?
    Qt 添加外部库文件(四种方法)
    百度全新的ARM架构服务器,一个2U机箱装6台,每台4个3T硬盘,每个机箱共72TB
    EntityFramework中支持BulkInsert扩展
    基于A2DFramework的事件机制实现
    事件机制与消息机制的架构设计区别
    .net平台下socket异步通讯(代码实例)
  • 原文地址:https://www.cnblogs.com/williamjie/p/11465604.html
Copyright © 2011-2022 走看看