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比较好;

又问:

适可而止 见好就收

JVM&NIO&HashMap简单问的更多相关文章

  1. 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍

    深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...

  2. HashMap 21问!!

    1:HashMap的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过8时,链表转换为红黑树. transient Node<K,V>\[\] t ...

  3. 面渣逆袭:JVM经典五十问,这下面试稳了!

    大家好,我是老三,"面渣逆袭"系列继续,这节我们来搞定JVM.说真的,JVM调优什么的一个程序员可能整个职业生涯都碰不到两次,但是,一旦用到的时候,那就是救命了,而且最重要的是-- ...

  4. HashMap常问面试题整理

    去面试时,hashmap总是被经常问的问题,下面总结了几道关于hashmap的问题. 1.hashmap的主要参数都有哪些? 2.hashmap的数据结构是什么样子的?自己如何实现一个hashmap? ...

  5. 《我想进大厂》之JVM夺命连环10问

    这是面试专题系列第五篇JVM篇. 说说JVM的内存布局? Java虚拟机主要包含几个区域: 堆:堆Java虚拟机中最大的一块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上分配空间.堆区 ...

  6. Java中NIO的简单介绍

    NIO基本介绍 Java NIO(New IO) 也有人称之为Java non-blocking IO 是从Java1.4版本开始引入的一个新的IO API,可以代替标准的IO API.NIO与原来的 ...

  7. 哈希表原理及hashmap简单实现

    哈希表也叫做散列表.在各种语言中都有hashmap的实现.其最突出的优点是查找和插入以及删除具有常数的时间复杂度 我们可以把哈希表理解为数组+链表 数组具有常数复杂度的查找,为什么呢,因为数组是在内存 ...

  8. 基于 Java NIO 实现简单的 HTTP 服务器

    1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...

  9. JVM内存结构简单认知

    关于JVM的面试传送门:https://blog.csdn.net/shengmingqijiquan/article/details/77508471 JVM内存结构主要划分为:堆,jvm栈,本地方 ...

随机推荐

  1. 转载-ThreadPoolExecutor里面4种拒绝策略(详细)

    原文链接:https://blog.csdn.net/wjs19930820/article/details/79849050 1 /** * 定义异步任务执行线程池 */ @Configuratio ...

  2. Unity Package包内插件解锁

    起因: 新版的Unity将模块工具与游戏中的资源文件分开放置,但有一个问题,里边的插件都是只读的,无法添加内容,连创建都是灰色的orz: 要想给这些插件添加一些别的自定义功能,那基本等于做梦,而且插件 ...

  3. js常用但是不容易记住的代码

    <!-- iframe 自适应高度度 --><iframe src="__CONTROLLER__/showlist" frameborder="0&q ...

  4. 使用XShell工具 linux 常用命令

  5. Jenkins 在 Tomcat 运行访问路径设置

    问题 最近用 Tomcat 搭建了个 Jenkins ,但是访问的时候需要端口加 /jenkins/ 才能进行访问.我们是直接将 Jenkins.war 包放在 webapps下的. 我们想直接通过不 ...

  6. OpenGL入门1.6:坐标系统,3D箱子

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经学习了如何利用矩阵变换来对所有顶点进行变换 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备 ...

  7. SSM定时任务(spring3.0)

    SSM定时任务主要分为两部分 1.applicationContext.xml配置文件设置 设置如下: 在xmlns中添加:xmlns:task="http://www.springfram ...

  8. Zipkin架构简介

    Zipkin基本概念 Span:基本工作单元,一次链路调用就会创建一个Span Trace:一组Span的集合,表示一条调用链路.举个例子:当前存在服务A调用服务B然后调用服务C,这个A->B- ...

  9. 机器视觉-python基础入门

    下载安装python版本 https://www.python.org/ 安装并且勾上为添加系统环境 然后进入cmd命令行里进行 这时候装成功了 然后装opencv依赖库 pip install  o ...

  10. IOS系统在Safari安装ipa文件

    配置点击下载的地址 itms-services://?action=download-manifest&url= "plist文件路径"plist文件配置 IIS网站配置要 ...