- Java事件机制包括哪三个部分?分别介绍。
- 事件源:触发事件的现场,工作内容包括:监听器注册,事件触发,事件参数构建,发布事件。
- 事件对象:事件现场和事件监听器之间的信息传递
- 事件监听器:根据事件对象传递的信息,进行事件的处理
- 这种方式和直接调用有什么区别?本质上没区别,设计模式都是这样。
- 代码复用:同一个事件源多种处理,多个事件源同一种处理,这两种方式都可以做到代码复用。
- 开闭原则:需要添加和删除事件的下逻辑,不用在事件源进行代码变更,只需要新增和取消注册监听器
- 方便异步化:因为传参和处理器已经抽象好了,直接通过消息组件发送+接收即可。
- 为什么要使用线程池?线程池有什么用?
- 线程池是池化技术的应用之一,此外还有链接池,池化技术的优点是:一是减少被池化对象创建和销毁成本,二是控制被池化元素的创建数量和机制(fixed、cached、single)。
- 问题来了?创建和销毁线程为什么开销很大?
- 需要为线程分配内存
- 需要调用syscall
- 需要初始化
- 另外一点,线程资源创建越多,会导致上下文切换越频繁。
- 说说几种常见的线程池及使用场景。
- fixed:指定大小,不希望在线程池在初始化之后再出现线程创建和销毁的动作,比如tomcat线程池。
- cache:根据任务流入量的情况,线程池动态在coreSize和maxSize之间变更,主要是为了最大程度利用cpu的性能。
- single:单线程执行,适用于少量且简单的任务,且在处理任务时可以天然保证线程安全。
- schedule:定时执行,如果业务有延时或定时执行的需求,且又不打算引入quartz组件或调度中间件的情况下,可以使用该类型。
- 线程池中的几种重要的参数及流程说明。
- coreSize:核心大小
- maxSize:最大大小
- keepAliveTime:存活时间,线程在空闲状态下的持续时间。
- workQueue:任务队列,线程池会从该队列中获取任务执行。
- 有界队列:可控任务量,如果超过大小,会配合rejectHandler进行处理。
- 无界队列:可存任务量取决于JVM堆内存大小,也就是说可能出现OOME,生产环境中需要格外注意。
- threadFactory:生成线程工厂,没什么特别的,就是new Thread,主要是要注意设置个可读性高的name
- rejectHandler:任务队列过长时,如何处理继续进来的任务
- 丢弃当前继续进来的任务,业务中使用时应该注意任务丢弃造成的影响。
- 丢弃最老的任务,相当于LRU,业务中使用时应该注意任务丢弃造成的影响。
- 抛异常,业务中使用时应该注意对该异常的监控,并将触发异常的任务信息日志打印出来,用于订正
- 让把任务丢给线程池的线程本身执行该任务,这样可以防止任务继续进入。
- 什么是反射机制?说说反射机制的作用?反射机制会不会有性能问题?
- 在运行时动态获取类信息、调用类方法的能力称为反射机制。
- 最常见的应用,注解、jdk动态代理InvocationHandler
- 根据getAnnotation获取类、方法、字段的注解类,根据注解类的配置执行相应代码增强或属性注入。
- 根据Proxy.newInstance+InvocationHandler实现动态生成代理类。
- 相比正常调用,反射多了一些安全检查逻辑,但反射使得JIT编译器无法有效做优化是反射慢的主要原因。
- 你怎么理解http协议?说说http协议的工作流程?
- 首先这是一个、一份、一种协议,协议是通信双方对通信内容格式的约定。
- 组成:method + uri + version + http + \n + (header+\n)*n + \n + body
- http有哪些请求提交方式?get和post有什么区别?
- GET:内容url可见,内容长度受限于url长度,一般用于检索数据。
- POST:内容url不可见,存放body中,内容长度不限,一般用于修改数据。
- PUT:基本不用
- DELETE:基本不用
- http中的200,302,403,404,500,503都代表什么状态?
- 200:Success
- 302:Found
- 403:Forbidden
- 404:Not Found
- 500:Server Error
- 502:Bad Getway
- 503:Service Unabailable
- 你怎么理解cookie和session,有哪些不同点?
- http是无状态协议,任意两次之间的通信没有任何关联。如果B操作想要基于A操作的结果成功而进行,那么需要某些方式来进行数据通信或数据共享。最常用的场景比如登陆状态保持、购物车功能等等。
- cookie和session分别是两种状态保持的手段,cookie是客户端状态保持,session是服务端状态保持。
- cookie通过在浏览器中保存A操作成功后写入的结果,运行机制是:在B请求时将该结果通过header中的cookie字段传入服务端,比如A操作是登录,登录成功后,在cookie添加cookie:loginStatus=true;服务端对所有请求都校验cookie中的这个字段判断登录状态。购物车同理,比如在cookie添加cookie:shopCart=good1&good2;缺点是,cookie存在浏览器中可以被用户篡改,非常不安全。
- session通过在服务端将用户的状态信息进行保存,可保存在各种地方,比如是单机应用可以保存在JVM内存中,集群应用可以保存在缓存中间件如redis、memcache中,状态数据的特点是非结构化、容忍丢失、定时失效等,所以上述三种kv介质进行存储是非常适合的。运行机制是:A请求成功后的数据存入介质中,并拿到key,同时将key设置到客户端cookie的sessionId中,这样每次客户端发起请求,先通过cookie拿到sessionId再通过sessionId拿到状态信息。这种方式优点在于安全,因为sessionId通常一串无意义的uuid,即使用户进行改动也最多拿不到session获取不到状态。这种方式的话sessionId类似于一个回家的钥匙,所以它能正确返回就很重要了,因为浏览器存在禁用cookie的功能,如果碰到这种情况,可以通过url重写技术将sessionId写入url中返回。
- 上述中的session+登录场景,因为是web应用最常用的功能之一,其中涉及到的cookie解析和写入、session存储和获取,未登录重定向等机制,目前已有非常成熟的框架来支持,比如apache-shiro和spring-security,开发人员只需要简单扩展,比如session存储和获取,状态信息对象定义等,即可实现登录功能。
- 什么是https,说说https的工作原理?
- 在http协议的基础上加了一层安全层,通过非对称加密+CA认证保证不被中间人攻击。
- nginx的作用?
- 静态页面缓存,如果页面不需要后端的实时数据渲染,比如hao123网站,可以通过web服务器的缓存直接返回页面,减少到服务器的消耗,更快响应请求。
- web缓存、负载均衡、网关
- 什么是java虚拟机,我为什么要使用?
- jvm是java代码运行的一套环境。
- 22、说说java虚拟机的生命周期及体系结构。
- 23、说一说java内存区域。
- 24、什么是分布式系统?
- 25、分布式系统你会考虑哪些方面?
- 26、讲一讲tcp协议的三次握手和四次握手流程。
- 27、为什么tcp建立连接协议是三次握手,而关闭连接确是四次握手呢?为什么不能用两次握手进行连接?
- 28、为什么tcp TIME-WAIT状态还需要等2MSL后才能返回到CLOSED状态?
- 29、什么是DoS、DDoS、DRDos攻击?如何防御?
- 30、描述一下Java异常层次结构。
- 31、什么是检查异常,不受检查异常,运行时异常?并分别举例说明。
- 32、Finally块一定会执行吗?
- 33、正常情况下,当在try块或catch块中遇到return语句时,finally语句在方法返回之前还是之后被执行?
- 34、Try、catch、finally语句块的执行顺序。
- 35、Java虚拟机中,数据类型可以分为哪几类?
- 36、怎么理解栈、堆?堆中存在什么?栈中存在什么?
- 37、为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
- 38、在java中,什么是栈的起始点,同时也是程序的起始点?
- 39、为什么不把基本类型放堆中呢?
- 40、Java中的参数传递时传值呢?还是传引用?
- 41、Java中有没有指针的概念?
- 42、Java中,栈的大小通过什么参数来设置?
- 43、一个空Object对象的占多大空间?
- 44、对象引用类型分为那几类?
- 45、讲一讲垃圾回收算法。
- 46、如何解决内存碎片的问题?
- 47、如何解决同时存在的对象创建和对象回收问题?
- 48、讲一讲内存分代及生命周期。
- 49、什么情况下触发垃圾回收?
- 50、如何选择合适的垃圾收集算法?
- 51、JVM中最大堆大小有没有限制?
- 52、堆大小通过什么参数设置?
- 53、JVM有哪三种垃圾回收器?
- 54、吞吐量优先选择什么垃圾回收器?响应时间优先呢?
- 55、如何进行JVM调优?有哪些方法?
- 56、如何理解内存泄漏问题?有哪些情况会导致内存泄漏?如何解决?
- 57、从分布式系统部署角度考虑,分哪几层?
- 58、如何解决业务层的数据访问问题?
- 59、为了解决数据库服务器的负担。如何做数据库的分布?
- 60、什么是著名的拜占庭将军问题?
- 61、为什么说tcp/IP协议是不可靠的?
- 62、讲讲CAP理念。
- 63、怎么理解强一致性、单调一致性和最终一致性?
- 64、分布式系统设计你会考虑哪些策略?
- 65、最常见的数据分布式是什么?
- 66、谈一谈一致性哈希算法。
- 67、Paxos是什么?
- 68、什么是lease机制
- 69、如何理解选主算法?
- 70、OSI有哪七层模型?TCP/IP是哪四层模型。
- 71、Fabric在哪里做的共识,如何解决双花问题和节点伪造问题的,比如说A给B转账5元,给C同志1元劳务费,但是该节点作弊了怎么办?
- 72、拜占庭算法的理解?
- 73、TCP协议拥塞是怎么解决的?
- 74、JAVA虚拟机的理解?
- 75、JAVA线程池的参数都有什么?
- 76、有序链表和二叉搜索树在查找和插入上时间复杂度的区别?了解过红黑树么,在插入上有什么优化?
- 77、介绍下你觉得你做的比较好的项目,解决了哪些技术难点?
- 78、一个数组中有正数和负数,找出来和最大的子数组
- 79、16瓶水中有1瓶水有毒,小白鼠喝了有毒的水1个小时后会死,一个小白鼠可以喝多瓶水,一瓶水也可以被多个小白鼠喝,现在给1个小时时间,最少需要几只小白鼠能够判断出来14瓶水是无毒的?
- 80、java虚拟机垃圾回收机制
- 81、事务隔离级别有什么?
- 82、concurrentHashMap实现原理?原来使用的什么锁?CAS具体如何实现的?
- 83、Fabric的共识机制
- 84、kafka不是共识机制么?
- 85、一个文本有很多单词,找出来其中词频最大的k个单词?如果内存读一次装不下怎么办?
- 86、HashMap扩容是怎么实现的?多线程同时put会存在什么问题?
- 87、单例怎么写,懒汉和饿汉哪个更适合多线程?
- 88、线程池的参数都有什么?
- 89、最近在看什么书?
- 90、比特币的共识机制?
- 91、项目中的监控:那个监控指标常见的有哪些?
- 92、微服务涉及到的技术以及需要注意的问题有哪些?
- 93、注册中心你了解了哪些?
- 94、consul 的可靠性你了解吗?
- 95、consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过?
- 96、项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理
- 97、Spring Boot除了自动配置,相比传统的 Spring 有什么其他的区别?
- 98、Spring Cloud 有了解多少?
- 99、Spring Bean 的生命周期
- 100、HashMap 和 hashTable 区别?
- 101、Object 的 hashcode 方法重写了,equals 方法要不要改?
- 102、Hashmap 线程不安全的出现场景
- 103、线上服务 CPU 很高该怎么做?有哪些措施可以找到问题
- 104、聊实验室的方向和做的项目
- 105、说一件你最得意的事儿,最失败的事儿和最出格的事儿
- 106、说一件你一直在坚持的事情
- 107、有几百亿个数字找出其中的中位数
- 108、JDK 中有哪几个线程池?
- 109、SQL 优化的常见方法有哪些
- 110、SQL 索引的顺序,字段的顺序
- 111、查看 SQL 是不是使用了索引?(有什么工具)
- 112、TCP 和 UDP 的区别?TCP 数据传输过程中怎么做到可靠的?
- 113、说下你知道的排序算法吧
- 114、常用的负载均衡,该怎么用,你能说下吗?
- 115、你有什么问题想问我的吗?
- 116、class存在哪儿,jvm结构
- 117、stringbuffer和stringbuilder的区别
- 118、Object 类中的方法
- 119、hashcode 和 equals 方法常用地方
- 120、hashmap put 方法存放的时候怎么判断是否是重复的
- 121、Object toString 方法常用的地方,为什么要重写该方法
- 122、Java 中有哪些线程安全的 Map?
- 123、Concurrenthashmap 是怎么做到线程安全的?
- 124、HashTable 你了解过吗?
- 125、如何保证线程安全问题?
- 126、volatile 的原子性问题?为什么 i++ 这种不支持原子性?从计算机原理的设计来讲下不能保证原子性的原因