- 对Java内存模型的理解,以及在并发中的应用
Java内存模型主要分为工作内存和主内存,Java内存模型规定所有的变量都存储在这个主内存中,每个线程有自己的工作内存,工作内存保存了主内存的拷贝,线程中对变量的操作必须在工作内存中,不能直接读取主内存中的变量。把一个变量从主类存中复制到工作内存中,那就要顺序地执行read和load操作,如果要把变量从工作内存中同步到主内存,就要顺序的执行store和write操作。
===============================================================================
在并发编程中解决了线程之间如何通信的问题,线程通信有两种方式,共享内存和消息传递。Java内存模型主内存对应共享内存方式。
Java8的内存分代改进,JVM的编译优化
Java8中取消了方式区这个概念,取而代之的是元空间,使用的是本地内存,其最大的可利用空间是整个系统内存的可用空间。
Java程序最初是通过解释器来解释执行的,当程序需要迅速启动时,解释器可以发挥作用,省去编译时间,立即执行;当程序运行后,编译器把越来越多的代码编译成本地代码,获得更高的执行效率。HotSpot虚拟机中内置了两个即时编译器c1和c2,主要的优化技术有:
===============================================================================
公共子表达式消除
如果一个子表达式已经计算过了,并且在整个表达式中没有变化,那这个表达式就成为了公共表达式,类似于数学中等量替换。
===============================================================================
数组边界检查消除
编译器通过数据流分析可以判断这个循环变量的取值永远在数组长度以内,那么整个循环中就可以把这个边界检查消除
===============================================================================
方法内联
能够去除方法调用的成本
=============================================
逃逸分析
分析对象动态作用域,当这个对象不会被外面的方法或者进程引用,可以为这个对象引入(栈上分配、同步消除、标量替换)手段
分析线程池中的实现原理和线程的调度过程
实现原理
1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作
线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。
2线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这
个工作队列里。如果工作队列满了,则进入下个流程。
3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程
来执行任务。如果已经满了,则交给饱和策略来处理这个任务
调度原理
ThreadPoolExecutor执行execute方法分下面4种情况。
1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤
需要获取全局锁)。
2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。
3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执行这一步骤需要获取全局锁)。
4)如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用
RejectedExecutionHandler.rejectedExecution()方法。
在工作中遇到哪几种设计模式,是怎么应用的
在工作中有一个需求是将集中器和设备入网需要对相应的信息做记录并存储到数据库中,设备入网过程中每发送一帧控制指令要等待底层相应再继续发送下一个指令,将处理请求、发送指令、等待响应这三个步骤用责任链模式重构。
Redis持久化的几种方式
RDB快照和AOF日志
AOF文件的更新频率通常比RDB文件的更新频率更高,AOF日志保存redis服务器所执行的写命令来记录数据库的状态的,RDB快照保存的是一个状态值。如果开启了AOF持久化功能,则服务器会优先使用AOF文件来还原数据库的状态。只有在AOF持久化功能关闭时,服务器才会使用RDB文件来还原数据库状态。
Redis 和 Memcached 和mongodb的区别
redis和memcached都是用作缓存,mongodb用作文档的存储。redis是一个存储在内存中,拥有比memcached更丰富的数据类型。redis单线程的,memcached是多线程的。redis支持多路IO复用,支持持久化操作,memcached不支持持久化操作。
Synchronized和Lock的区别
Synchronized是Java中的关键字,在JVM层面上;可以判断锁的状态;锁的类型包括可重入锁、非公平;Lock是一个类,在finally中必须释放锁,可以判断锁的状态,锁的类型中包括可重入锁,可公平锁。
数据库索引的实现,B+树的结构和操作,为什么不用红黑树
索引一般是放在磁盘中的,索引是存储引擎用于快速找到记录的一种数据结构,有B+树、哈希索引等。
B+树是在B-树的基础上改进而来的,B+树叶子节点存储数据且叶子节点之间还加了指针形成链表,每个节点都可以拥有多(M)个孩子节点,是为了降低树的高度,减少查询时间。索引是存放在磁盘的,内存读取磁盘中的数据,先读取B树的根节点,在接着往下读取,直到找到那个值。
红黑树是二叉树,红黑树一个节点只能存一个值,树的深度更大,查询效率更低。
Dubbo的底层实现原理及工作机制
Dubbo是一个由阿里巴巴团队开源的基于rpc协议的微服务分布式框架,致力于提供高性能和透明化的RPC远程服务调用框架采用URL作为配置信息的统一格式,所有扩展点都通过传递URL携带配置信息。采用microkernel+plugin模式,microkernel负责组装plugin。
工作机制:
首先dubbo分为5个部分:远程服务运行容器、远程服务提供者(生产者)、注册中心、远程服务调用者(消费者)、监控中心。
- 远程服务提供者启动服务,向注册中心注册自己提供的服务,
- 远程服务调用者向注册中心订阅自己所需要的服务。
- 注册中心返回提供者的地址给消费者,如果出现变更的话,会更新变更的数据给消费者
- 消费者从远程接口列表中,调用远程接口,dubbo会基于负载均衡算法,选一台提供者进行调用,如果调用失败就会选择另外一台。
- 消费者和提供者在内存中累计调用次数和时间,定时每分钟发送一次统计数据到监控中心。