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. Java并发编程入门,看这一篇就够了

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容.这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉 ...

  2. Spring框架的相关介绍

    Spring是一个开源轻量级的框架,它的核心是控制反转(IOC)和面向切面编程(AOP). 作为业务层框架的spring能够很好地整合表现层跟持久层. IOC:将类的创建和依赖关系写到配置文件里,可以 ...

  3. this泛指函数的上下文

    this泛指函数的上下文 当前函数运行的类型上下文.

  4. Jsp学习笔记(2)——页面导航、表单、EL表达式

    页面导航 有两种跳转页面的方法.重定向和请求转发 两者区别: 请求转发(forward) 重定向(rerect) 请求服务次数 1 2 是否保留第一次请求request范围的属性 保留 不保留 地址栏 ...

  5. .net core入门-项目启动时报错:HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure

    在打开Core的项目首页时,页面有时候会出现:HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure的错误,但是这里面看不出任何错误详情,这个时候 ...

  6. python基础(27):类成员的修饰符、类的特殊成员

    1. 类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私 ...

  7. 利用Python突破验证码限制

    一.实验说明 本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点: Python基本知识 PIL模块的使用 二.实验内容 安装 pillow(PIL)库: $ sudo apt- ...

  8. CAS(比较并交换)

    一.CAS(无锁的执行者) CAS包含3个参数:内存值  V 旧的预期值  A 新值  B 当且仅当V值等于A值时,将V的值改为B值,如果V值和A值不同,说明已经有其他线程做了更新,则当前线程什么都不 ...

  9. NumPy实现数组的拼接和分裂

    一.数组的拼接 import numpy as np x=np.array([,,]) x2=np.array([,,])np.concatenate([x,x2]) 输出:array([1, 2, ...

  10. Spark的Monitoring

    一.启动历史页面监控配置: $ vi spark-defaults.conf spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop0 ...