java开发3~5年工作经验面试题

java开发3~5年工作经验面试题

关于java虚拟机

平时我们的Java文件是如何运行的?

public class Math{
    public static final int data=666;
    public static User user = new User();

    public int compute(int a,int b){ //一个方法对应一块栈帧内存区域
        return a+b;
    } 
    public static void main(String[] args){
		Math math = new Math();
        math.compute(1,2);
    }
}

Java文件由JVM编译成class文件。。。

堆:当我们创建一个对象时,会把对象放在堆里面。

栈(线程):当执行一个方法时,会在栈中给该方法分配一块内存区域,这个内存区域暂且称为小W

栈帧:小W相当于一个先进后出的队列,执行A方法时,会创建一个栈帧,小W会为该栈帧分配区域用于储存A方法的局部变量,如果A方法里调用了B方法,然后执行到了B方法时,再创建一个B方法的栈帧,小W会为该栈帧分配区域用于储存B方法的局部变量,执行完B方法后,该栈帧会被删除,意为出栈,最后执行完A方法后,删除A方法的栈帧。

对象是存储在堆里,局部变量存储在局部变量表里,那如果局部变量是一个对象怎么搞的?

当然是先把对象存储到堆里,然后把该对象的在堆中的地址或引用存储在局部变量表中。同理,静态变量是存储在方法区中,如果静态变量是一个对象,先把对象存储到堆里,也是在方法区中存储的对象的引用。

程序计数器:是每个线程都独有的,程序计数器上面那一大块内存会挖一块分给每一个线程。

面试题案例:为什么每个方法区都要有一个程序计数器?

比如一个方法执行到了第五行的代码,突然出现一个优先级跟高的线程夺走了CPU分片,该方法会挂起,当优先级高的方法执行完毕后会继续执行该方法,程序计数器的作用就是标记该方法执行到哪里了,要接着继续执行下去。

方法区:存放常量、静态变量和类信息

本地方法栈:和栈没什么区别,唯一的区别是,本地方法栈是给native修饰的方法分配空间的。

堆区

堆区分为年轻代和老年代。

提一个概念:可达性分析算法(minor gc)

将GC ROOTS对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。

GC ROOTS根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。

上面的图示,字节码执行引擎执行class文件,但同时还会执行垃圾收集线程,收集垃圾的模式就是可达性分析算法,本来堆中的Eden区域存储着所有的对象,然后经过可达性分析算法后,将标记的非垃圾对象转移到 s0 区域中,Eden中剩下的对象都为垃圾对象,全部清理掉,继续接收存储新的对象。

s0区域经过可达性分析算法之后,将非垃圾对象转移到s1区域中,s0剩下的垃圾对象全部清理掉。

每进行一次可达性分析算法,筛选下来的对象的年龄就加一,如果年龄达到15之后,则存储在老年代空间中。

JVM调优具体调优什么?

减少full gc!

上面说的是minor gc垃圾回收算法,这里提到full gc垃圾回收算法

当老年代空间被占满之后会触发full gc垃圾回收,这时会停到所有的用户线程(STW)(即用户访问),专心回收整个堆中的垃圾对象,平时full gc需要的时间会很少,几乎没有感知,但是如果full gc花费时间长的话,用户角度就是死机状态,所以要优化!

面试题案例:什么是STW?既然知道STW的存在会造成所谓死机的状态,那存在的意义是什么?

假如STW(停掉用户线程)不存在,当老年代空间占满之后就会触发full gc垃圾回收,那么此时,用户线程执行正在执行中,full gc从GC ROOTS根节点开始搜索,然后标记哪些对象是垃圾,哪些对象不是垃圾,但是标记好之后,用户线程执行完了,用户线程的局部变量也销毁了,对象在堆中的引用也就没了,本来标记为了不是垃圾,现在又是垃圾,那到底是不是垃圾?烦死了!难道要full gc再重新搜索标记一遍吗?真要那样的话,用户进程也一直在继续执行,结束,执行,结束,那full gc则永远也停不下啦!

面试题案例:JVM垃圾回收机制,何时触发MinorGC等操作?

Minor GC 也被称为新生代 GC,指发生在新生代(PSYoungGen)的垃圾收集动作,新生代包括三块内存区域 eden 区,from (From Survivor)区 与 to(To Survivor) 区。对象优先在 eden 创建并区分配内存,当 eden 区内存无法为一个新对象分配内存时,就会触发 Minor GC。至于为什么把新生代分为 3 个区,主要是为了新生代复制算法的实现。

关于JVM

JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,Minor GC、Major GC和Full GC之间的区别

关于java基础

String类为什么是final的?
Java中的队列都有哪些,有什么区别
String,StringBuilder,StringBuffer区别是什么?底层数据结构是什么?分别是如何实现的?
HashSet的底层实现是什么?它与HashMap有什么关系?
Java 如何重写对象的 equals 方法和 hashCode 方法?为什么需要重写?
使用HashSet存储自定义类对象时为什么要重写equals和hashCode方法?
HashMap的底层原理(数组+链表+红黑树)面试必考题
ArrayList和LinkedList底层实现原理、性能差异
JDK1.7和JDK1.8中HashMap为什么是线程不安全的?
ConcurrentHashMap的底层实现原理与源码剖析
JDK1.7和JDK1.8中ConcurrentHashMap底层实现的区别
并发编程的锁机制 synchronize和lock的区别
什么是CAS? Java乐观锁之CAS操作
hashMap和hashTable底层原理的区别?hashTable的put()做了哪些事?
volatile关键字的理解;用在哪些场景?
线程的两种实现方式,以及区别
NIO与IO的区别
Java IO与NIO的区别、BIO、NIO、AIO
static关键字的场景和意义
什么是事务,怎么理解事务?
动态代理的两种实现方式
面试必备之乐观锁与悲观锁
xml文件有几种定义形式?解析方式?
彻底搞清分库分表
MySQL--事务隔离级别及传播机制
JAVA设计模式总结之23种设计模式
Servlet底层原理、Servlet实现方式、Servlet生命周期
Java对象的序列化和反序列化
java反射中,Class.forName和classloader的区别
session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
Java中的队列都有哪些,有什么区别
Java7、Java8的新特性
spring中BeanFactory和FactoryBean的区别
代理模式与装饰者模式的区别
画一下Java多线程几种状态变更的图,图中包括线程所处的状态及线程各个状态之间如何进行切换的
Java中静态变量和实例变量的区别
BIO、NIO和AIO的区别
JAVA关于静态static的面试题

8张图带你理解Java内存区域
int与integer的区别(基本数据类型与引用数据类型)

get和post的区别?

1,get请求的参数拼接在url上面,post请求的参数在请求体中

2,get请求的url大小限制在1024kb,post的请求体大小没有限制,可以用来传输大数据

3,get请求用于查询数据,post请求常用来提交数据

4,get请求发送一次请求,把请求头和请求体一起发送给服务器,服务器响应200,post请求发送两次请求,第一次先发送请求头,待服务器响应100后再发送请求体,服务器响应200,耗时较长,因此get请求效率比post效率高。

tcp和udp的区别
springmvc和springboot的区别
面向对象和面向过程的思想
session和cookie的区别和联系,session的生命周期 多个服务部署时session管理
反射创建类实例的三种方式是什么?
LinkedHashMap和HashMap的比较使用
反射中,Class.forName和ClassLoader.loadClass区别
什么是一致性Hash算法?Redis集群的应用
是否可以从一个static方法内部发出对非static方法的调用?
sleep和wait的区别

内容 链接地址
Java基础知识面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390612
Java集合容器面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588551
Java异常面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390689
并发编程面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104863992
JVM面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390752
Spring面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397516
Spring MVC面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397427
Spring Boot面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397299
Spring Cloud面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397367
MyBatis面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/101292950
Redis面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/103522351
MySQL数据库面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104778621
消息中间件MQ与RabbitMQ面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588612
Dubbo面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390006
Linux面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588679
Tomcat面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397665
ZooKeeper面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397719
Netty面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104391081
架构设计&分布式&数据结构与算法面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/105870730

高并发 / 多线程 / 分布式

Volatile与synchronize的区别
(Java并发编程) volatile关键字解析
springboot与spring相比优势是什么?
Java线程池的四种用法与使用场景
线程等待wait()和通知notify()的详细使用
Java线程池实现原理
Linux搭建Redis集群主从复制和哨兵模式
Redis持久化的几种方式,优缺点是什么? 内存型数据库Redis,是如何实现持久化的?
Redis的缓存失效策略
生产环境中的 Redis 是怎么部署的?
项目中缓存是如何使用的?为什么要用缓存?
redis分布式锁,面试官请随便问,我都会
解释一下什么是ThreadLocal?如何使用?
一文秒懂 Java 守护线程 ( Daemon Thread )
线程池异步回调的方式

网络通信

怎么理解http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么?
TCP 三次握手,为什么是三次?两次可以吗?
tcp协议三报文握手过程_一文彻底搞懂 TCP三次握手、四次挥手过程及原理
http协议的状态码
TCP三次握手、四次挥手的理解

Spring

springIOC的理解和实现原理
spring是如何通过xml配置或者注解配置生成实例对象的?
Spring AOP底层实现的基本原理
Spring MVC 中 如何解析视图及视图解析的详细流程
Spring常用注解
代码中事务是如何控制的?
spring框架中需要引用那些jar包,以及这些jar包的用途
Spring中的BeanFactory和ApplicationContext之间的区别和联系
spring注入的几种方式
@Autowired和@Resource的区别

SpringBoot

Spring boot启动类上的注解@springbootApplication注解的说明
Spring和SpringBoot的区别和比较
SpringBoot自动判断项目是否是Web项目
超详细java中的ClassLoader详解
Spring如何解决循环依赖的问题的?比如A autowired B,B autowired A,内部是如何实现的?
高频面试题:Spring 如何解决循环依赖?
springboot自动装配原理
springboot启动类都做了些什么
Spring Boot启动类加载器

Mybatis

MyBatis体系结构与工作原理
Mybatis处理多个参数的几种方式?
Mybatis占位符有几种?区别是什么?
mybatis的缓存机制:一级缓存和二级缓存的区别
Mybatis如何开启二级缓存?
Mybatis注解形式开启二级缓存?
MyBatis 类型转换器
mybatis接口没有实现类,他是如何操作数据库的?
Mybatis是如何和Mysql字段进行映射的?映射的三种方式?
Mybatis的常用注解有哪些

数据库Mysql

数据库行锁和表锁,存储过程,函数
左连接、右连接和内连接的区别?
mysql中四种存储引擎的区别和选择
单个索引、联合索引、主键索引 联合索引(复合索引)和单个索引
什么是聚集索引? 主键就是聚集索引吗?有什么区别?
数据库自增主键可能的问题
[MySQL数据库优化的八种方式(经典必看)
索引失效场景
简单介绍下Mysql的索引类型
高并发下如何做到安全的修改同一行数据,乐观锁和悲观锁是什么
MySQL中乐观锁和悲观锁的具体实现方式
Mysql如何实现乐观锁
INNODB的行级锁有哪2种,解释其含义?
行级锁包括共享锁和排他锁,具体实现的方式是什么?

Spring Cloud微服务

什么是springcloud?它有什么优势?
springcloud和dubble的区别
SpringBoot和SpringCloud的区别
史上最简单的 SpringCloud 教程系列,每个模块的作用?如何使用?
服务雪崩、降级与熔断

关于所做项目

支付系统设计中,如何防止重复支付?

算法

实现冒泡排序算法
实现快速排序算法
实现选择排序算法

zookeeper

用大白话给你解释Zookeeper的选举机制

posted @ 2020-07-27 13:36  你樊不樊  阅读(3357)  评论(0编辑  收藏  举报