![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java核心技术
文章平均质量分 72
最常见的 Java 核心技术面试题,带你三分钟搞懂,面试再也不虚。
喵呜刷题
来来来,我们一起组队学习!
展开
-
volatile 关键字 与 CPU cache line 的效率问题
cache 是为了进一步提升计算机性能引入的存储结构,cache和内存的最小的传输单位是cache line,因为每个物理core有自己独享的L1、L2 cache,并且一个cache line可能存在多个cache中,所以就出现了MESI协议保证cache line的一致性。进而又引入了cache line的伪共享的问题,为了进一步降低cache line伪共享所带来的的消耗,我们应该尽量避免多个线程同时修改的不同变量在同一个cache line中。如有好的面试知识或技巧期待您的共享!原创 2023-09-01 08:41:23 · 396 阅读 · 0 评论 -
Java有哪些对象分配规则?
一、对象优先分配在Eden区对象的内存分配,从大方向上将,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。原创 2022-04-28 09:56:23 · 754 阅读 · 0 评论 -
说说响应式和函数式
响应式(Reactive Programming,简称RP)在计算机中,响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。响应式编程是一种编程的思维模式,区别于声明式编程,响应式编程更注重数据流转,每一段程序都是围围绕着数据来设计的,原始数据,在哪,经过那些处理之后,最终变成什么样子。像这样围绕着数据流转的程序,我们可以简称为执行序列。原创 2022-04-29 10:40:55 · 1133 阅读 · 2 评论 -
JVM 如何减少 STW
什么是STW?STW 是 GC 中很重要的概念,全称 Stop the world,即程序全局暂停时间,GC 优化算法都是围绕减少 STW 的时间或频率。原创 2022-04-29 10:40:47 · 1037 阅读 · 0 评论 -
Spring 是如何解决循环依赖的?
什么是循环依赖?说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。原创 2022-04-30 11:31:13 · 231 阅读 · 0 评论 -
Spring中bean的生命周期
Servlet的生命周期:实例化 New,初始化 Init,接收请求service,销毁destroy;原创 2022-04-30 11:31:01 · 95 阅读 · 0 评论 -
描述 JVM 加载 class 文件的机制?
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。类装载方式,有两种 :原创 2022-04-29 10:40:02 · 296 阅读 · 0 评论 -
JVM垃圾回收器有哪些
一、Serial收集器(新生代、复制算法)这是一个单线程工作的收集器,这个单线程并不是只用一条线程完成垃圾回收的操作,而是在进行垃圾回收的时候,必须停掉其他所有的工作线程,直到它收集结束。原创 2022-04-30 11:30:51 · 2948 阅读 · 0 评论 -
JVM垃圾收集有哪些算法,各自的特点?
标记 - 清除算法首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它的主要不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。原创 2022-04-30 11:30:38 · 263 阅读 · 0 评论 -
字节码是什么?字节码增强有哪些?
Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。原创 2022-04-30 11:30:27 · 1961 阅读 · 0 评论 -
JVM 有哪些编译优化?
编译方式执行本地代码比解释方式更快!除去虚拟机解释执行字节码时额外消耗时间的原因外,还有一个很重要的原因就是虚拟机设计团队几乎把对代码的所有优化措施都集中在了即时编译器之中因此一般来说,即时编译器产生的本地代码会比Javac产生的字节码更加优秀。原创 2022-04-30 11:30:19 · 551 阅读 · 0 评论 -
Java 对象创建过程
Java对象创建时机使用new关键字创建对象,Java规范中被称为 : 由执行类实例创建表达式而引起的对象创建。使用Class类的newInstance方法(反射机制)使用Constructor类的newInstance方法(反射机制)使用Clone方法创建对象使用(反)序列化机制创建对象原创 2022-04-30 11:30:09 · 466 阅读 · 0 评论 -
CGLIB 和 JDK 动态代理什么区别?
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。原创 2022-04-28 09:58:38 · 389 阅读 · 0 评论 -
说说Spring事务传播行为和隔离级别
Spring事务的4个隔离级别Isolation Level(事务隔离等级):Serializable:最严格的级别,事务串行执行,资源消耗最大;原创 2022-04-29 10:40:33 · 916 阅读 · 0 评论 -
如何理解 Spring 的 IOC 和 DI?
IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。原创 2022-04-29 10:40:23 · 652 阅读 · 0 评论 -
什么是 AOP,AOP 的作用是什么?
AOP全称(Aspect Oriented Programming)面向切片编程的简称。AOP面向方面编程基于IoC,是对OOP的有益补充;AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。原创 2022-04-29 10:39:38 · 19436 阅读 · 0 评论 -
如何打印虚拟机堆栈信息?
jmap它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。原创 2022-04-29 10:39:25 · 877 阅读 · 0 评论 -
为什么要重排序?
什么是重排序编译器、JVM 或者 CPU 都有可能出于优化等目的,对于Java 程序实际指令执行的顺序进行调整,这就是重排序。原创 2022-04-29 10:39:16 · 671 阅读 · 1 评论 -
说说happens-before规则
happens-before 关系的定义:如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果就会对第二个操作可见两个操作之间如果存在 happens-before 关系,并不意味着 Java 平台的具体实现就必须按照 happens-before 关系指定的顺序来执行。原创 2022-04-29 10:39:02 · 358 阅读 · 0 评论 -
JMM和硬件内存架构
现在的计算机中一般都是有多个CPU,同时CPU会有多个核心,java在执行多线程的时,这些线程会在核心里面并行运行。在计算机的硬件内存模型中,绝大多数的数据会存储在计算机的主存中,CPU上会有一组寄存器,部分堆和栈中的数据会存储在CPU的寄存器中,CPU操作寄存器的速度要远远的高于操作主存,在CPU寄存器和主存之间还存在一层CPU Cache,CPU 的缓存分为一级缓存,二级缓存,CPU操作缓存的速度要稍微慢于寄存器,主存要比寄存器和缓存大很多。原创 2022-04-29 10:38:53 · 196 阅读 · 0 评论 -
描述一下 JVM 的内存结构?
1.7 OR 1.8 JVM内存结构原创 2022-04-28 09:58:06 · 87 阅读 · 0 评论 -
JMM解决缓存一致性&重排序问题
缓存一致性问题由于主存与 CPU 处理器的运算能力之间有数量级的差距,所以在传统计算机内存架构中会引入高速缓存来作为主存和处理器之间的缓冲,CPU 将常用的数据放在高速缓存中,运算结束后 CPU 再讲运算结果同步到主存中。使用高速缓存解决了 CPU 和主存速率不匹配的问题,但同时又引入另外一个新问题:缓存一致性问题。原创 2022-04-28 09:57:58 · 270 阅读 · 0 评论 -
什么是 Java 内存模型( JMM )
Java 内存模式是 Java 语言规范的一部分。为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作的行为规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。原创 2022-04-28 09:57:48 · 1272 阅读 · 0 评论 -
Java虚拟机中有哪些类加载器?
启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。原创 2022-04-28 09:57:20 · 265 阅读 · 0 评论 -
Mybatis中的#和$的区别
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.原创 2022-04-28 09:57:09 · 232 阅读 · 0 评论 -
Statement和PreparedStatement有什么区别?哪个性能更好?
PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;原创 2022-04-28 09:56:55 · 250 阅读 · 0 评论 -
说说JDBC 操作数据库的步骤?
1)加载(注册)数据库驱动(到JVM)。2)建立(获取)数据库连接。3)创建(获取)数据库操作对象。4)定义操作的SQL语句。5)执行数据库操作。6)获取并操作结果集。7)关闭对象,回收数据库资源(关闭结果集–>关闭数据库操作对象–>关闭连接)。原创 2022-04-28 09:56:42 · 4913 阅读 · 0 评论 -
说说 Java内存溢出与内存泄漏
堆内存溢出(OutOfMemoryError: Java heap space)内存溢出是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。原创 2022-04-28 09:56:33 · 731 阅读 · 0 评论 -
你会如何处理上线后频繁FullGC
三个关键字:上线、频繁、FullGC上线上线是否符合流程规范,这里大家可以根据实际情况展开。频繁频繁是需要有参照系的,一般作为参照系有两种,1、个人思维认知(历史经验)。2、系统历史表现情况。如果已经上线一段时间的项目请优先以第2种为参照,先去查看监控看看 GC 的历史表现情况。原创 2022-04-27 11:08:16 · 216 阅读 · 0 评论 -
什么是双亲委派模型?
双亲委派模型原理:当一个类加载器收到类加载任务时,会先交给自己的父加载器去完成,因此最终加载任务都会传递到最顶层的BootstrapClassLoader,只有当父加载器无法完成加载任务时,才会尝试自己来加载。原创 2022-04-27 11:07:11 · 3885 阅读 · 0 评论 -
说说类的加载过程
类加载的过程包括:加载、验证、准备、解析、初始化,其中验证、准备、解析统称为连接。原创 2022-04-27 11:06:10 · 359 阅读 · 0 评论 -
Java GC Root有哪些?
虚拟机内部的引用,比如类加载器等;native,本地方法栈引用的对象(在本地方法栈)final,常量引用的对象(比如字符串常量池的引用;在方法区)static,静态变量引用的对象(比如Java类的引用类型静态变量;在方法区)synchronzied引用的对象(所有被同步锁持有的对象;在堆里)jvm虚拟机栈引用的对象(比如:各个线程被调用的方法堆栈中用到的参数、局部变量和临时变量;在jvm虚拟机栈中)Thread,活动的线程原创 2022-04-27 11:05:15 · 1394 阅读 · 0 评论