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 on   你樊不樊  阅读(3542)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

导航

点击右上角即可分享
微信分享提示