JDK

面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖

百般思念 提交于 2020-10-26 08:23:13
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃不掉。如果你回答得好,那么这就是你的必杀技,反正,那就是面试官的必杀技,这也是取这个标题的原因,当然,本文的目的是为了让你在之后的所有面试中能多一个必杀技,专门用来绝杀面试官! 本文的核心思想就是, 当面试官问: “请讲一讲Spring中的循环依赖。”的时候, 我们到底该怎么回答? 主要分下面几点 什么是循环依赖? 什么情况下循环依赖可以被处理? Spring是如何解决的循环依赖? 同时本文希望纠正几个目前业界内经常出现的几个关于循环依赖的错误的说法 只有在setter方式注入的情况下,循环依赖才能解决(错) 三级缓存的目的是为了提高效率(错) OK,铺垫已经做完了,接下来我们开始正文 什么是循环依赖? 从字面上来理解就是A依赖B的同时B也依赖了A,就像下面这样 体现到代码层次就是这个样子 @Component public class A { // A中注入了B @Autowired private B b; } @Component public class B { // B中也注入了A @Autowired private A a; } 当然,这是最常见的一种循环依赖

Hadoop知识点总结

青春壹個敷衍的年華 提交于 2020-10-26 06:58:29
一:大数据概述 一、大数据简介 1. 概念:指无法在一定时间范围内使用常规软件工具进项捕捉、管理和处理数据集合,需要新处理模式才能具有更强的决策力、洞察力和流程优化能力的海量、高增长率和多样化的信息资产。 2. 作用: 解决海量数据的存储和海量数据的分析计算问题。 3. 大数据与云计算的关系:大数据必须依托云计算的分布式处理、分布式数据库和云存储、虚拟化技术,有效地处理大量的容忍经过时间内的数据。 二、大数据特征 1. Volume(容量大):数据的大小决定所考虑的数据的价值和潜在的信息。 2. Velocity(速度快):获得并处理数据的效率。是区分传统数据挖掘最显著特征。 3. Variety(多样性):数据类型的多样性。以数据库/文本的结构化数据和以网络日志,图片,音频、视频等为主的非结构化数据。 4. Value(价值):合理运用大数据,以低成本创造高价值。 5. Variability(可变性):妨碍了处理和有效地管理数据的过程。 6. Veracity(真实性):数据的质量。 7. Complexity ( 复杂性 ):数据量巨大,来源多渠道。 三、大数据应用场景 1. 物流仓储:大数据分析系统助力商家精细化运营,提升销量,节约成本。 2. 零售及商品推荐:分析用户消费习惯,给用户推荐可能喜欢的商品,为用户购买商品提供方便。 3. 旅游:深度结合大数据能力和旅游行业需求

Spring扩展的集合LinkedMultiValueMap和ConcurrentReferenceHashMap解析

半腔热情 提交于 2020-10-26 05:40:16
MultiValueMap是一个接口,它的一个键可以对应多个值(列表) public interface MultiValueMap< K , V > extends Map< K , List< V >> { /** * 获取key的第一个值 */ @Nullable V getFirst ( K key) ; /** * 添加value到key对应值的列表中 */ void add ( K key , @Nullable V value) ; /** * 添加一个列表到key对应的值中 */ void addAll ( K key , List<? extends V > values) ; /** * 添加另一个 MultiValueMap到本对象中 */ void addAll (MultiValueMap< K , V > values) ; /** * 给key设置一个给定的值value */ void set ( K key , @Nullable V value) ; /** * 将Map所有key,value设置进去 */ void setAll (Map< K , V > values) ; /** * 转化为一个单值Map */ Map< K , V > toSingleValueMap () ; } 该接口的实现类为LinkedMultiValueMap

深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

偶尔善良 提交于 2020-10-26 04:13:19
前言 先解释一下什么是 类加载器 ,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为“ 类加载器(Class Loader) ”。 类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。每个类加载器都有一个独立的类名称空间,所以每个类唯一性都必须是建立在是否为同一个类加载器的前提下的。 否则,即使是两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。 例如: public class ClassLoaderOneTest { public static void main(String[] args) throws Exception{ ClassLoader oneLoader = new ClassLoader() { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { String classFileName = name.substring(name.lastIndexOf(".")+1)+".class"; InputStream inputStream = getClass()

浅谈Tomcat服务器优化方法-蛙课网

不羁的心 提交于 2020-10-26 03:16:22
对于JavaWeb开发人员而言,Tomcat已成为默认的web服务器,但是在生产环境下使用Tomcat部署应用,我们如果采用Tomcat默认的配置,尤其是内存和线程的配置,其配置都很低,容易成为性能瓶颈,所以我们需要对Tomcat服务器进行优化,提升其运行性能,下面我们一起来看看Tomcat如何优化? 一、Tomcat内存优化,启动时告诉JVM需要多大内存(调优内存是最直接的方式) Windows 下的 catalina.bat Linux 下的 catalina.sh 在该文件中配置jvm的内存空间,如: JAVA_OPTS='-Xms256m -Xmx512m' -Xms<size> JVM初始化堆的大小 -Xmx<size> JVM堆的最大值,实际参数大小根据服务器配置或者项目具体设置; 二、Tomcat 线程优化 在server.xml中配置 比如: <Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" /> maxThreads="X" 表示最多同时处理X个连接 minSpareThreads="X" 初始化X个连接

静态代码扫描工具

醉酒当歌 提交于 2020-10-25 21:48:20
安装sonarQube平台 本文只安装sonarQube平台,并未安装sonar-scanner扫描器。 需要安装的内容: 1、jdk11(最新sonarQube要求jdk11+) 2、sonarQube平台 本文中所用到环境及安装包版本: 1、windows 10 2、jdk11 3、sonarQube7.9.1 windows下安装 1、jdk11安装包下载: 百度网盘链接: https://pan.baidu.com/s/1dluJnOjOstqxYPXeHhVY2Q 密码:zelh 2、jdk11安装和环境变量配置 安装:一路next即可。 环境变量配置: 3、sonarQube安装包下载 百度网盘链接: https://pan.baidu.com/s/1dluJnOjOstqxYPXeHhVY2Q 密码:zelh 4、sonarQube安装 将3中的安装包,解压到本地任意目录。 启动sonarQube平台 双击sonarQube安装目录当中,bin目录下的StartSonar.bat文件。等待sonarQube启动成功。 访问sonarQube平台 默认启动端口为9000 在浏览器当中,访问: http://localhost:9000 来源: oschina 链接: https://my.oschina.net/u/4370838/blog/4278439

架构设计:远程调用服务架构设计及zookeeper技术详解

纵然是瞬间 提交于 2020-10-25 17:41:10
​Hadoop是一个技术生态圈,zookeeper是hadoop生态圈里一个非常重要的技术。 当我研究学习hadoop的相关技术时候,有两块知识曾经让我十分的困惑,一个是hbase,一个就是zookeeper。 hbase的困惑源自于它在颠覆了我对数据库建模的理解,而zookeeper的困惑却是我无法理解它到底是干嘛的。 远程调用服务的架构设计总述 首先我们要再深入理解下为什么应用软件服务里需要一个远程调用服务,远程调用服务解决了软件设计中的什么问题,它的架构设计又有什么理论根据了? 3.0版本的网站架构带来了新的网站架构总图,如下所示: 有了远程调用服务,我们可以做到业务级别的集群。 例如:一个制造企业,一般都会有采购业务,生产业务、销售业务以及财务业务。按照传统的思路我们都会给每个业务独立开发一个系统,如果引用了远程调用服务,我们可以将这些业务都做成独立的服务,这些服务组成业务集群,而这些服务都是用统一的远程调用服务作为操作的入口。 换句话说不管什么样的服务对于调用者来说都是统一的,这样前端的调用者可以做到应用的统一,所谓的应用的统一淘宝网站是最典型的代表,我们在一个同一的网站里可以操作各种不同的应用,而不会发生因为应用的不同我们就得重新访问新的地址或者重新登录到另外一个系统里做其他业务的操作。 而服务端这边,完全可以摆脱传统的客户端和服务端耦合的开发

面试官问 Spring AOP 中两种代理模式的区别,我懵逼了

谁都会走 提交于 2020-10-25 11:16:08
基本介绍 代理模式 是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴) 问题 为什么要控制对于某个对象的访问呢?举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。 你可以实现延迟初始化:在实际有需要时再创建该对象。对象的所有客户端都要执行延迟初始代码。不幸的是, 这很可能会带来很多重复代码。 在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。 解决方案 代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。 代理将自己伪装成数据库对象,

金三银四面试季节之Java 核心面试技术点

爷,独闯天下 提交于 2020-10-25 07:37:36
描述一下 JVM 的内存区域 程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。 Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。前面谈程序计数器时,提到了当前方法;同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM 直接对 Java 栈的操作只有两个,就是对栈帧的压栈和出栈。栈帧中存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等。 堆(Heap),它是 Java 内存管理的核心区域,用来放置 Java 对象实例,几乎所有创建的Java 对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定的“Xmx”之类参数就是用来指定最大堆空间等指标

Java是如何实现Future模式的?万字详解!

北战南征 提交于 2020-10-25 07:02:54
JDK1.8源码分析项目(中文注释)Github地址: https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs 1 Future是什么? 先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们。在这一过程中,这一系列的单号都是我们收货的重要凭证。 因此,JDK的Future就类似于我们网购买东西的单号,当我们执行某一耗时的任务时,我们可以另起一个线程异步去执行这个耗时的任务,同时我们可以干点其他事情。当事情干完后我们再根据future这个"单号"去提取耗时任务的执行结果即可。因此Future也是多线程中的一种应用模式。 扩展 : 说起多线程,那么Future又与Thread有什么区别呢?最重要的区别就是Thread是没有返回结果的,而Future模式是有返回结果的。 2 如何使用Future 前面搞明白了什么是Future,下面我们再来举个简单的例子看看如何使用Future。 假如现在我们要打火锅,首先我们要准备两样东西:把水烧开和准备食材。因为烧开水是一个比较漫长的过程(相当于耗时的业务逻辑),因此我们可以一边烧开水(相当于另起一个线程),一边准备火锅食材(主线程),等两者都准备好了我们就可以开始打火锅了。 //