一面(40分钟左右)
一 自我介绍及项目
-
自我介绍(实习:以后主动提出自己在学校的成绩和亮点)
-
项目讲解(自己负责的模块和整个小组协作问题)
-
项目中是怎么用到redis的
二 java基础
- 说说有哪些线程安全的集合
1)早期线程安全的集合
我们先从早期的线程安全的集合说起,它们是Vector和HashTable
1.Vector
Vector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用
2.HashTable
HashTable和HashMap类似,不同点是HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的K,V都不能是null,但HashMap可以,它现在也因为性能原因被弃用了
2)Collections包装方法
Vector和HashTable被弃用后,它们被ArrayList和HashMap代替,但它们不是线程安全的,所以Collections工具类中提供了相应的包装方法把它们包装成线程安全的集合
List<E> synArrayList = Collections.synchronizedList(new ArrayList<E>());
Set<E> synHashSet = Collections.synchronizedSet(new HashSet<E>());
Map<K,V> synHashMap = Collections.synchronizedMap(new HashMap<K,V>());
...1234567
Collections针对每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步
3) java.util.concurrent包中的集合
1.ConcurrentHashMap
ConcurrentHashMap和HashTable都是线程安全的集合,它们的不同主要是加锁粒度上的不同。HashTable的加锁方法是给每个方法加上synchronized关键字,这样锁住的是整个Table对象。而ConcurrentHashMap是更细粒度的加锁
在JDK1.8之前,ConcurrentHashMap加的是分段锁,也就是Segment锁,每个Segment含有整个table的一部分,这样不同分段之间的并发操作就互不影响
JDK1.8对此做了进一步的改进,它取消了Segment字段,直接在table元素上加锁,实现对每一行进行加锁,进一步减小了并发冲突的概率
2 CopyOnWriteArrayList和CopyOnWriteArraySet
它们是加了写锁的ArrayList和ArraySet,锁住的是整个对象,但读操作可以并发执行
3
除此之外还有ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque等,至于为什么没有ConcurrentArrayList,原因是无法设计一个通用的而且可以规避ArrayList的并发瓶颈的线程安全的集合类,只能锁住整个list,这用Collections里的包装类就能办到
2 ConcurrentHashMap为什么是线程安全的,对比与hashMap有什么区别
我觉得讲的挺好的ConcurrentHashMap博客
https://blog.csdn.net/programerxiaoer/article/details/80040090?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control
-
HashMap底层
-
依赖注入的底层原理,两个对象AB怎么 相互调用
三 java虚拟机
-
说说java虚拟机的内存是怎样的?
-
什么时候会进行垃圾回收(自己引申到怎么判断对象存活,引用计数法(1.2前)和可达性分析)
-
什么情况下会出现内存溢出错误,会出在哪些区域。
-
一个已经上线的项目出现这个错误怎么解决
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
引起内存溢出的原因有很多种,常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小;
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
重点排查以下几点:
1) 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2 ) 检查代码中是否有死循环或递归调用。
3) 检查是否有大循环重复产生新对象实体。
4) 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
5) 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况:
在Eclipse中查看JVM的内存使用情况
方法如下:
菜单 Window => Preferences => General => 右边,把 Show Heap Status 打上勾就会在右下角任务栏显示内存监视器,并且可以点击内存回收。
四 网络
- 计算机网络是你们专业课对吧,说说他们是怎么分层的
业内普遍的分层方式有两种。OSI七层模型 和TCP/IP四层模型。
OSI七层模型:物、数、网、传、会、表、应
TCP/IP四层模型:链、网、传、应
- 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2)数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1
3)网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
-
传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
-
会话层:通过传输层(端口号:传输端口接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
6)表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
- 应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
分层功能示意:
OSI七层模型结构体: 物、数、网、传、会、表、应
TCP/IP 四层模型:数、网、传、应
- tcp是什么,http和tcp/ip 这些协议有什么区别和关系。
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 1() 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
- get和post的区别?你提到了post是安全的,他是加密的吗?
五 linux
-
怎么给文件授权,chmod777你怎么理解?
-
你平常是怎么连接到linux的?有没有注意到ssh协议?
-
平时还有还有用到其他连接是ssh协议的吗?
-
怎么查看当前的进程,或是查询一个进程
二面(30分钟)
(死在了二面上,二面也要好好准备也有可能是自己不合适
自己又没过就不给大家提建议了o(╥﹏╥)o,只写问题)
-
给你三分钟做下自我介绍(自我介绍 。。。一言难尽 适度发挥吧)
-
讲一下自己的项目,做项目是为了什么,在项目中负责哪些部分,这个项目做了多久。
-
你觉得你的大学生活里做的最成就感的事是什么?
个人觉得这里不要太凸显 品质,向技术或奖项上靠 更多的从一个奖上面凸显自己和别人不一样的能力
-
你觉得你在这行业对比与其他人你的优势是什么?(我觉得这是最重要的问题)
-
你有什么爱好?
-
你平常周末都会做什么?
-
那你有什么缺点呢?
-
你的大学生活里有遇到什么挫折吗(必须要说,我回答成遗憾了。。)
-
你在未来对自己的期望是什么,或者说几年内能达成什么样的目标。
-
你有什么想对我提问的