# 蚂蚁金服面试题

高级JAVA

# JVM数据存储模型 一面

参考答案

JVM数据存储模型

  • 分为程序计数器 、 Java 虚拟机栈 、本地方法栈、Java 堆、方法区、元数据区。

新生代、年老代的构造

  • 新生代分为Eden、From Survivor、To Survivor,内部空间占比是8:1:1,在堆中占比是1:3;老年代在堆中占比是2:3。

# 谈谈Java中的 GC算法

什么时候会触发Minor GC,什么时候会触发Full GC

参考答案

  • Minor GC,也叫新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
    • 虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间
  • Full GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC。
    • 晋升进入老年代的对象大小大于老年代的可用内存,这个时候会触发Full GC。
    • System.gc()方法的调用。
    • Metaspace区内存达到阈值。
    • 堆中产生大对象超过阈值。

总结

可以发现其实堆内存的Full GC一般都是两个原因引起的,要么是老年代内存过小,要么是老年代连续内存过小。无非是这两点,而元数据区Metaspace引发的Full GC可能是阈值引起的。

# 什么对象会从新生代晋升到老年代

参考答案

  • Eden区满时

    Eden区满时,进行Minor GC,当Eden和一个Survivor区中依然存活的对象无法放入到Survivor中,则通过分配担保机制提前转移到老年代中。

  • 大对象直接进入年老代

    大对象即需要大量连续内存空间的Java对象,如长字符串及数组。经常出现大对象导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来安置他们。设置-XX:PretenureSizeThreshold参数,即对象的大小大于此值, 就会绕过新生代, 直接在老年代分配, 此参数只对Serial及ParNew两款收集器有效。

  • 长期存活的对象将进入年老代

    虚拟机给每个对象定义了一个对象年龄计数器,在对象在Eden创建并经过第一次Minor GC后仍然存活,并能被Suivivor容纳的话,将会被移动到Survivor空间,并对象年龄设置为1。每经历过Minor GC,年龄就增加1岁,当到一定程度(默认15岁,可以通过参数-XXMaxTenuringThreshold设置),就将会晋升年老代。

  • 空间分配超负荷

    虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。

# GC可达性分析中哪些算是GC ROOT

参考答案

  • 虚拟机栈(栈帧中的本地变量)中的引用的对象。
  • 本地方法栈中JNI本地方法的引用对象。
  • 方法区中静态变量引用的对象。
  • 方法区中常量引用的对象。
  • 活着的线程,包含处于等待或阻塞的线程。

# JVM参数调优,使用过的调优工具

参考答案

Xss,设置每个线程的堆栈大小。-Xmx和-Xms设置堆的大小,互不影响。

  • Jps,虚拟机进程状况工具。
  • Jmap,Java内存印象工具。
  • Jstat,虚拟机统计信息监视工具。
  • Jstack,Java堆栈跟踪工具。

# Java 有什么锁类型

参考答案

  • 偏向锁
  • 轻量级锁
  • 重量级所
  • 公平锁
  • 非公平锁
  • 饥饿锁
  • 活锁

# 描述下线程池的处理流程

参考答案

# 类加载机制

参考答案

一个类加载到虚拟机中一共有几个步骤,这些步骤的顺序哪些是固定的,哪些是不固定的,为什么不固定

# ConcurrentHashMap怎么实现的线程安全

参考答案

采用Node + CAS + Synchronized来保证并发安全进行实现。

# Volatile关键字特性以及实现原理

参考答案

在JVM底层volatile是采用“内存屏障”来实现的。观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令,lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成; 它会强制将对缓存的修改操作立即写入主存; 如果是写操作,它会导致其他CPU中对应的缓存行无效。

# 并发容器有哪些

参考答案

  • ConcurrentHashMap
  • CountSylDownLanch
  • CyclicBarrier
  • Semaphore

# 并发容器和同步容器的区别

参考答案

ConcurrentHashMap和HashTable角度

# SQL语句的优化和注意的事项 二面

参考答案

# 哪些库或者框架用到NIO

参考答案

JDK1.4中就已经加入了NIO模式, JDK1.7 提供了全新的异步NIO模式,涉及的类统一在java.nio包下。 其中Netty (JBOSS提供的一个Java开源框架NIO框架)对Java的NIO模式进行了封装,方便调用,NIO目前很多框架都用到,比如:

  • xxl-job
  • RocketMQ
  • Dubbo
  • Kafka SocketServer
  • 等主流的分布式框架都离不开NIO

# Spring 都有哪几种注入方式

参考答案

# Spring IOC的实现原理

参考答案

# 如何定位一个慢查询

参考答案

# 聚集索引和非聚集索引知道吗

参考答案

# 聚集索引和非聚集索引的使用场景

参考答案

# Nosql引擎用的什么存储结构

参考答案

# 关系型数据库和NoSQL各自的优劣点

参考答案

# 微服务架构下,怎么保证事务

参考答案

# 分布式一致性协议raft和paxos

参考答案

# Zookeeper中的ZAB协议,选主算法

参考答案

# 自我介绍 三面

参考答案

# 参与的并发项目,从设计到部署,按照流程讲一遍

参考答案

# 项目相关你用过redis,用在什么场景,怎么使用的

参考答案

# mysql同步机制原理,几种同步方法

参考答案

# 数据库主从同步如何实现,事务如何实现

参考答案

# 谈谈你对SOA和微服务的理解

参考答案

# 分布式架构从应用层面涉及到的调整和挑战

参考答案

# 阿里系中间件 RocketMQ 及原理

参考答案

# RocketMQ与kafka有什么异同

参考答案

# 举例谈谈中间件的实现原理

在阿里有了解过什么中间件吗?实现原理?与其他开源消息队列有什么特点

参考答案

# 为什么选择换公司

参考答案

# 三年到五年的职业规划

参考答案

# 你有想问我的

参考答案