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. DFS(四):剪枝策略

    顾名思义,剪枝就是通过一些判断,剪掉搜索树上不必要的子树.在采用DFS算法搜索时,有时候我们会发现某个结点对应的子树的状态都不是我们要的结果,这时候我们没必要对这个分支进行搜索,砍掉这个子树,就是剪枝 ...

  2. kafka 重放 重播 从某个时间点或者offset开始消费

    转自: https://www.jianshu.com/p/932663e9a226 consumer.subscribe(topicA); consumer.poll(100);//正常订阅topi ...

  3. 11-scrapy(递归解析,post请求,日志等级,请求传参)

    一.递归解析: 需求:将投诉_阳光热线问政平台中的投诉标题和状态网友以及时间爬取下来永久储存在数据库中 url:http://wz.sun0769.com/index.php/question/que ...

  4. CAS单点登录流程图

    1.cas单点登录原理图 2.cas使用代理服务器流程图 3.cas和spring security集成流程图

  5. 易飞审核员调用DEMO-DELPHI

    作用:我已在其他文章里提过.直接调用易飞审核员程序,易飞9全版本全模块通用. 亮点:错误直接返回错误信息,并非错误代码. 最全.最优的易飞审核员接口开发,支持个案审核员接口开发.有需要的联系本人. 唯 ...

  6. 多模块springboot项目启动访问不了jsp页面

    被springboot项目maven打包.启动.访问折腾的头都大了,一步一个坑,在解决了所有的问题之后,那种欣喜若狂的心情只有自己能体会,决定要好好记录一下了,废话不多说了,直接进入正题. 问题和排查 ...

  7. Java入门系列之字符串创建方式、判断相等(一)

    前言 陆续从0开始学习Java出于多掌握一门语言以后的路也会更宽,.NET和Java兼顾,虽然路还很艰难,但事在人为.由于Java和C#语法相似,所以关于一些很基础的内容不会再重头讲,Java系列中所 ...

  8. oracle学习笔记(十) 查询练习(一)

    查询练习一 表创建 create table employee as select * from soctt.emp ; --记得授权 sysdba用户登录 grant select on scott ...

  9. Redis设置密码,保护数据安全

    1.设置密码方法 在 redis.conf 的配置文件中修改参数 requirepass 的值为需要设置的密码, 保存配置文件后,重启Redis就可以. 建议 设置比较复杂和长的密码,防止被暴力破解. ...

  10. JS基础语法---分支语句之:switch-case语句---3个练习

    switch-case语句---分支语句---多分支语句 语法: switch(表达式){ case 值1:代码1;break; case 值2:代码2;break; case 值3:代码3;brea ...