初级Java工程师面试问题清单

1. sychronized与lock的区别,使用场景,sychronized源码

    简单来说synchronized较为常用,可读性好。lock粒度更细,容易出事,除非性能要求特别高,一般不用lock;

2.jvm的minor GC与Full GC触发机制。

    Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。

    Major GC/Full GC:老年代GC,指发生在老年代的GC。

    Minor GC触发条件:当Eden区满时,触发Minor GC。

    Full GC触发条件:

        (1)调用System.gc时,系统建议执行Full GC,但是不必然执行

        (2)老年代空间不足

        (3)方法去空间不足

        (4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

        (5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年      代的可用内存小于该对象大小

3.如何设计海量数据的存储系统。

    hadoop    hbase    elasticsearch    索引

4.缓存的实现原理,设计缓存需要注意什么。

    缓存概念其实很广,有磁盘缓存,DB缓存,H5前端缓存等等。对了,还有CPU 的一级和二级缓存。

    根据业务场景,通常缓存有以下几种使用方式:

  • 懒汉式(读时触发):写入DB后, 然后把相关的数据也写入Cache
  • 饥饿式(写时触发):先查询DB里的数据, 然后把相关的数据写入Cache
  • 定期刷新:适合周期性的跑数据的任务,或者列表型的数据,而且不要求绝对实时性

    1.缓存一致性问题

        当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持        一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移    除对应的缓存。  

    2.缓存并发问题

        缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。

   问题很多,可以参考https://www.cnblogs.com/shangxiaofei/p/9132392.html

5.操作系统的页式存储

    连续分配内存方式会形成许多“碎片”,通过紧凑的方式将碎片拼接成一块大的空间,但是拼接过程系统开销太大。如果允许将一个进程直接分散地装入到许多不相邻的分区中,那么就不需要再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。

    简单存储:进程数据全部装入内存
    虚拟存储:部分装入 :又分为 虚拟分段,虚拟分页,虚拟段页式

    https://blog.csdn.net/qwe6112071/article/details/70595168?locationNum=5&fps=1

6.volatile关键字如何保存内存可见性

    volatile的作用: 

  1. 保证内存可见性(但不保证操作的原子性)。
  2. 防止指令重排。

    如何保证:lock:将主内存的变量锁定,为一个线程所独占。

    具体参考:https://blog.csdn.net/calledwww/article/details/79350426

7.如何保存内存可见性

    可见性:一个线程对共享变量值的修改,能够及时的被其他线程看到。 
    共享变量:如果一个变量在每个线程的工作内存中都有副本,那么这个变量就是这些线程的共享变量。

    下面讲一下关于Java内存的一些东西

  • 所有的变量都存储在主内存
  • 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一个拷贝)

    Synchronized可以实现

  • 原子性
  • 可见性

    Java内存模型的两条规定

  • 线程对共享变量的所有操作必须在自己的工作内存中进行,不能直接从住内存中读写
  • 不同线程直接不能直接访问其他线程工作内存中的变量,线程间变量的传递需要通过主内存

8.http请求过程与原理

https://blog.csdn.net/qq_37495916/article/details/79316893

一次HTTP操作称为一个事务,其工作整个过程如下:

    1 ) 地址解析

    如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm

    从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
    协议名:http
    主机名:localhost.com
    端口:8080
    对象路径:/index.htm

    在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。
    2)封装HTTP请求数据包

    把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
    3)封装成TCP包,建立TCP连接(TCP的三次握手)

      在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口

    4)客户机发送请求命令

    建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。

    5)服务器响应

    服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

    6)服务器关闭TCP连接

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

    Connection:keep-alive

    TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

9.TCP连接的特点、TCP连接如何保证安全可靠

确认机制:保证每个数据包都能收到,
差错检验:保证数据包的正确,
流量控制:保证接收方不会溢出。
顺序编号:保证传输的有序性

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议

TCP(Transmission Control Protocol 传输控制协议

UDP和TCP都属于传输层协议

https://blog.csdn.net/weirongbao123/article/details/50580275

    TCP提供一种面向连接的、可靠的字节流服务。 
    面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。 
    TCP通过下列方式来提供可靠性:
    1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。                                                                  (将数据截断为合理的长度)
    2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。                       (超时重发)
    3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。                                                                 (对于收到的请求,给出确认响应) (之所以推迟,可能是要对包做完整校验)
    4、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
    5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。  (对失序数据进行重新排序,然后才交给应用层)
    6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据)
    7、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)TCP使用的流量控制协议是可变大小的滑动窗口协议。
    字节流服务::
    两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。
    TCP对字节流的内容不作任何解释:: TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

10.简述TCP三次握手过程,并说明为什么要3次握手

    为什么不能一次握手很容易理解,TCP是面向连接的,一次握手肯定建立不了连接,一条信息发出去连个回信都没有怎么连接?

    为什么不能两次握手呢,假设只有两次握手,当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以A在一段时间内没收到ACK后,再发送一个SYN,B也成功收到,然后A也收到ACK,这时A发送的第一个SYN终于到了B,对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它,而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费

11.AOP的实现原理

https://blog.csdn.net/weianluo/article/details/81607134

12.动态代理与cglib实现的区别

13.看过spring源码没,说说ioc容器的加载过程

14.字节码的编译过程是怎么样的

15.JVM如何调优

开发性问题

1项目使用过哪些技术,为什么要使用这些技术?

2.项目中某个比较重要的点是如何实现的(需要深入技术的原理)

3.如果需要扩展某个功能,如何降低系统的耦合度?

4.如果针对某个功能进行优化,你会怎么设计和优化?

5.最近在研究什么技术?(考察培养潜力)

猜你喜欢

转载自blog.csdn.net/weianluo/article/details/81590124