面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器.虚拟机栈.本地方法栈.堆.方法区 面试官:对象一般存放在哪个区域? 我:堆. 面试官:对象都存放在堆中吗? 我:是的. 面试官:你了解过逃逸分析吗? 我(皱了皱眉):是内存溢出吗? 面试官:不是的. 我(挠了挠头):不是很了解. 面试官:今天的面试先到这,回去等消息吧! 然后就没有然后了,不甘心的我开始了查找相关资料. 逃逸分析 逃逸分析(Escape Analysis)是一种确定对象的引用动态范围的分析方法,说人话就是:分…
从JDK1.6开始,JVM对锁进行了各种优化,目的就是为了在线程间更高效的共享数据和解决互斥同步的问题.从锁优化的话题开始,可以引申出很多考点面试题,比如锁优化的技术.各优化技术的细节.CAS实现原理.CAS的ABA问题及如何解决等,持续发散还会引发更多问题,例如逃逸分析等,可以看出技术点都是相关联的,需要不断积累和梳理. 面试官:JVM实现了哪些锁优化技术? 小白:自旋锁.自适应自旋锁.锁粗化.锁消除.偏向锁.轻量级锁. 面试官:介绍一下自旋锁?为什么引入自旋锁? 小白:自旋锁就是在请求获取锁…
写在前面 在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是不是重复造轮子,多此一举呢?今天,我们就一起来探讨下这个问题. 再造轮子? 既然JVM中提供了synchronized关键字来保证只有一个线程能够访问同步代码块,为何还要提供Lock接口呢?这是在重复造轮子吗?Java的设计者们为何要这样做呢?让我们一起带着疑问往下看. 为何提供Lock接口? 很多…
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Java中的对象就一定是在堆上分配的吗?"这个问题呢?看来,我们从接触Java就被灌输的这个观点值得我们怀疑. 关于面试题 标题中的面试题为:Java中的对象都是在堆上分配的吗? 面试官这样问,有些小伙伴心里会想:我从一开始学习Java时,就知道了:Java中的对象是在堆上创建的,对象的引用是存储到栈中的…
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的JavaAPI,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等. 熟悉基于JSP和Servlet的JavaWeb开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JST…
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 3万字总结,Mysql优化之精髓 为了不复制粘贴,我被逼着学会了JAVA爬虫 技术部突然宣布:JAVA开发人员全部要会接口自动化测试框架 Redis 5种数据结构及对应使用场景,全会面试要加分的 写在前边 最近有个公众号粉丝和我聊了聊他面试的经历,一个刚入坑Java两年的新人,由于疫情原因视频面试,…
1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数据操作(更新)完成,确保不会被其他线程所影响.例如:Java中synchronized关键字和Lock的实现类都是悲观锁.   乐观锁:在获得数据时不会加锁,而是在操作数据时判断数据是否被修改过,因此可能会出现线程抢占的情况.当数据未被更新时,直接更新数据:当数据被更新后,抛出异常或通过程序自旋重试…
服务端: public class NoBlockServer { public static void main(String[] args) throws IOException { // 1.获取通道 ServerSocketChannel server = ServerSocketChannel.open(); // 2.切换成非阻塞模式 server.configureBlocking(false); // 3. 绑定连接 server.bind(new InetSocketAddre…
// 抽象类,定义泛型<T> public abstract class BaseDao<T> { public BaseDao(){ Class clazz = this.getClass(); ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); clazz = (Class) pt.getActualTypeArguments()[0]; System.out.println(claz…
// 请求直接交给线程池来处理 public void push(PushParam pushParam) { try { pushServiceThreadExecutor.submit(() -> { handler(pushParam); }); } catch (Exception e) { logger.error("pushServiceThreadExecutor error, exception{}:", e); } } public class UnsafeCo…