2026/1/11 16:46:31
网站建设
项目流程
建设物业公司网站,电商详情页设计思路,浏览器网站入口,程序开发环境JVM运行时数据区 线程私有区#xff1a; 虚拟机栈#xff1a;每次调用方法都会在虚拟机栈中产生一个栈帧#xff0c;每个栈帧中都有方法的参数、局部变量、方法出口等信息#xff0c;方法执行完毕后释放栈帧本地方法栈#xff1a;为native修饰的本地方法提供的空间#x…JVM运行时数据区线程私有区虚拟机栈每次调用方法都会在虚拟机栈中产生一个栈帧每个栈帧中都有方法的参数、局部变量、方法出口等信息方法执行完毕后释放栈帧本地方法栈为native修饰的本地方法提供的空间在HotSpot中与虚拟机合二为一程序计数器保存指令执行的地址方便线程切回后能继续执行代码线程共享区堆内存Jvm进行垃圾回收的主要区域存放对象信息分为新生代和老年代方法区存放类信息、静态变量、常量、运行时常量池等信息。JDK1.8之前用持久代实现JDK1.8后用元空间实现元空间使用的是本地内存而非在JVM内存结构中什么情况下会内存溢出堆内存溢出当对象一直不停的创建而不被回收时加载的类越来越多时虚拟机栈的线程越来越越多时栈溢出 方法调用次数过多一般递归不当造成JVM有哪些垃圾回收算法标记清除算法 标记不需要回收的对象然后清除没有标记的对象会造成许多内存碎片。复制算法 将内存分为两块只使用一块进行垃圾回收时先将存活的对象复制到另一块区域然后清空之前的区域。用在新生代标记整理算法 与标记清除算法类似但是在标记之后将存活对象向一端移动然后清除边界外的垃圾对象。用在老年代GC如何判断对象可以被回收引用计数法已淘汰为每个对象添加引用计数器引用为0时判定可以回收这个可能会出现两个对象相互引用无法回收的问题可达性分析法从GCRoot开始往下搜索搜索过的路径称为引用链若一个对象GCRoot没有任何的引用链则判定可以回收GCRoot有虚拟机栈中引用的对象方法区中静态变量引用的对象本地方法栈中引用的对象典型垃圾回收器G1 JDK1.9以后的默认垃圾回收器支持并发采用标记整理复制算法注重响应速度类加载器和双亲委派机制从父类加载器到子类加载器分别为BootStrapClassLoader 加载路径为JAVA_HOME/jre/libExtensionClassLoader 加载路径为JAVA_HOME/jre/lib/extApplicationClassLoader 加载路径为classpath还有一个自定义类加载器当一个类加载器收到类加载请求时会先把这个请求交给父类加载器处理若父类加载器找不到该类再由自己去寻找。该机制可以避免类被重复加载还可以避免系统级别的类被篡改篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho类加载过程加载加载字节码文件将字节码中的静态变量和常量转换到方法区在堆中生成class对象作为方法区入口连接验证验证字节码文件的正确性准备正式为类变量在方法区中分配内存并设置初始值解析将符号引用解析为直接的一个引用类在实际内存中的地址初始化执行类构造器这里不是常规的构造方法为静态变量赋值并初始化静态代码块JVM中有哪些引用强引用new的对象。哪怕内存溢出也不会回收软引用只有内存不足时才会回收弱引用每次垃圾回收都会回收例如ThreadLocal中的key虚引用必须配合引用队列使用一般用于追踪垃圾回收动作对象头中有哪些信息对象头中有两部分一部分是MarkWork,存储对象运行时的数据如GC分代年龄、GC标记、锁的状态、线程ID等另外一部分是指向对象类型的指针如果是数组还有一个部分存放数组长度JVM内存参数-Xmx[]: 堆空间最大内存-Xms[]: 堆空间最小内存一般设置成跟堆空间最大内存一样的-Xmn[]: 新生代的最大内存-xx[use 垃圾回收器名称]指定垃圾回收器-xss: 设置单个线程栈大小一般设堆空间为最大可用物理地址的百分之80JVM类初始化顺序父类静态代码块和静态成员变量-子类静态代码块和静态成员变量-父类代码块和普通成员变量-父类构造方法-子类代码块和普成员变量-子类构造方法四、MysqlMyIAm和InnoDB的区别InnoDB支持事务MyIAm不支持InnoDB支持外键MyIAm不支持InnoDB是聚簇索引MyIAm是非聚簇索引InnoDB支持行锁和表锁MyIAm只支持表锁InnoDB不支持全文索引MyIAm支持InnoDB支持自增和MVCC模式的读写MyIAm不支持Mysql事务特性原子性一个事务内的操作要么成功要么失败会滚不存在中间状态一致性事务前后的数据总量不变也就是说一个事务执行之前和执行之后都必须处于一致性状态隔离性是指多个事务并发执行的时候事务与事务之间相互不影响持久性事务一旦提交发生的改变不可逆的即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作事务靠什么保证原子性由undolog日志保证他记录了需要回滚的日志信息回滚时撤销已执行的sql一致性由其他三大特性共同保证是事务的目的隔离性由MVCC保证持久性由redolog日志和内存保证mysql修改数据时内存和redolog会记录操作宕机时可恢复事务的隔离级别在高并发情况下并发事务会产生脏读、不可重复读、幻读问题这时需要用隔离级别来控制1、脏读出现原因一个事务读取到了缓存中另一个事务未提交的脏数据。(说明当事务B对data进行了修改但是未提交事务此时事务A对data进行读取并使用事务B修改的数据做业务处理。)2、幻读出现原因一个事务在读取数据时另一个事务插入了数据导致上个事务第二次读取数据时数据不一致。(说明data 表有一条数据事务A对data进行读取 事务B对data进行数据新增 此时事务A读取只有一条数据而最后实际data是有两条数据就好象发生了幻觉一样情况成为幻读)3、不可重复读出现原因读取数据的同时可以进行修改(说明事务A、事务B同时对data进行访问事务A对data进行读取事务B对data进行修改当事务A第一次对data进行读取完后事务B提交此时当事务A第二次读取该数据时的数据就与第一次读取的数据不同这种情况称为不可重复读)read_uncommitted读未提交可读取未提交事务的操作数据最低的隔离级别一般都没有用的。这种情况会出现脏读。read_committed读已提交一个事务等另一个事务提交之后才可进行读取解决了脏读问题但会出现不可重复读repeatable_read可重复读读取事务开启的时候不能对数据进行修改解决了不可重复读问题但是存在幻读问题serializable序列化是最高的事务隔离级别可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下比较耗数据库性能一般不使用什么是快照读和当前读快照读读取的是当前数据的可见版本可能是会过期数据不加锁的select就是快照读当前读读取的是数据的最新版本并且当前读返回的记录都会上锁保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate排他锁、select lockin share mode共享锁 都是当前读MVCC是什么MVCC是多版本并发控制为每次事务生成一个新版本数据每个事务都由自己的版本从而不加锁就决绝读写冲突这种读叫做快照读。只在读已提交和可重复读中生效。实现原理由四个东西保证他们是undolog日志记录了数据历史版本readView: 事务进行快照读时产生的视图记录了当前系统中活跃的事务id控制哪个历史版本对当前事务可见隐藏字段DB_TRC_ID 最近修改记录的事务ID隐藏字段DB_Roll_PTR 回滚指针配合undolog指向数据的上一个版本MySQL有哪些索引主键索引一张表只能有一个主键索引主键索引列不能有空值和重复值唯一索引唯一索引不能有相同值但允许为空普通索引允许出现重复值组合索引对多个字段建立一个联合索引减少索引开销遵循最左匹配原则全文索引myisam引擎支持通过建立倒排索引提升检索效率广泛用于搜索引擎聚簇索引和非聚簇索引的区别聚簇索引将索引和值放在了一起根据索引可以直接获取值如果主键值很大的话辅助索引也会变得很大非聚簇索引叶子节点存放的是数据行地址先根据索引找到数据地址再根据地址去找数据他们都是b数结构B和B数的区别为什么使用B数二叉树索引字段有序极端情况会变成链表形式AVL数树的高度不可控B数控制了树的高度但是索引值和data都分布在每个具体的节点当中若要进行范围查询要进行多次回溯IO开销大B树非叶子节点只存储索引值叶子节点再存储索引具体数据从小到大用链表连接在一起范围查询可直接遍历不需要回溯MySQL有哪些锁基于粒度表级锁对整张表加锁粒度大并发小行级锁对行加锁粒度小并发大间隙锁间隙锁锁住表的一个区间间隙锁之间不会冲突只在可重复读下才生效解决了幻读基于属性共享锁又称读锁一个事务为表加了读锁其它事务只能加读锁不能加写锁排他锁又称写锁一个事务加写锁之后其他事务不能再加任何锁避免了脏读问题MySQL如果做慢查询优化分析sql语句是否加载了不需要的数据列分析sql执行计划字段有没有索引索引是否失效是否用对索引表中数据是否太大是不是要分库分表篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho哪些情况索引会失效where条件中有or除非所有查询条件都有索引否则失效like查询用%开头索引失效索引列参与计算索引失效违背最左匹配原则索引失效索引字段发生类型转换索引失效mysql觉得全表扫描更快时数据少索引失效Mysql内连接、左连接、右链接的区别内连接(inner join)结合两张表的记录返回相关的查询结果返回的是两个表的交集部分。select * from A a inner join B b on a.idb.id左连接(left join)左连接查询左表的信息全部展示出来右表只会展示符合搜索条件的信息不足的地方记为NULLselect * from A a left join B b on a.idb.id右连接(rigth join)右连接查询右表的信息全部展示出来左表只会展示符合搜索条件的信息不足的地方记为NULLselect * from A a right join B b on a.idb.id五、Spring系列Bean的作用域Singleton:一个IOC容器只有一个Prototype:每次调用getBean()都会生成一个新的对象request:每个http请求都会创建一个自己的beansession:同一个session共享一个实例application:整个serverContext只有一个beanwebSocket:一个websocket只有一个beanBean的生命周期通过构造方法创建bean实例无参构造为bean的属性设置值和对其它bean引用调用set方法把bean实例传递bean后置处理器的方法postProcessBeforeInitialization调用bean的初始化方法需要进行配置初始化的方法把bean实例传递bean后置处理的方法postProcessAfterInitializationbean可以使用了对象获取到了当容器关闭的时候调用bean的销毁的方法需要进行配置销毁的方法如果没有配置后置处理器bean的生命周期将没有3和5Spring 事务原理spring事务有编程式和声明式我们一般使用声明式在某个方法上增加Transactional注解这个方法中的sql会统一成功或失败原理是当一个方法加上Transactional注解spring会基于这个类生成一个代理对象并将这个代理对象作为bean当使用这个bean中的方法时如果存在Transactional注解就会将事务自动提交设为false然后执行方法执行过程没有异常就会提交有异常就会回滚spring事务失效场景事务方法所在的类没有加载到容器中事务方法不是public类型同一类中一个没有添加事务的方法调用另外以一个添加事务的方法事务不生效spring事务默认只回滚运行时异常可以用rollbackfor属性设置业务自己捕获了异常那么事务会认为程序正常秩序spring事务的隔离级别default:默认级别使用数据库自定义的隔离级别其它四种隔离级别与mysql一样spring事务的传播行为spring的7种传播行为required(默认传播行为)它是Spring里面默认的事务传播行为也就新当前存在事务就加入到当前事务去执行如果不存在事务就创建一个事务例如方法A调用方法B它们用同一个事务。(如果B没有事务它们会用同一个事务。)(只要有一个回滚整体就会回滚)requires_new它不管是否存在事务它都会新开启一个事务来执行新老事务相互独立的外部事务抛出异常并不会影响内部事务的一个正常提交例如方法A调用方法B它们用不同的事务。(B不会用A的事务会新增事务。)supports:表示支持当前的事务如果当前不存在事务就以非事务的方式去执行例如方法A调用方法B如果A没有事务那么B就以非事务运行。如果A有事务就以A事务为准。如果A没有事务那么B就会以非事务执行。mandatory:它是一个强制的事务执行如果当前不存在事务就抛出一个异常支持当前事务如果当前没有事务就会抛出异常。例如方法A调用方法B如果方法A没有事务那么就会抛出异常。not_supported表示以非事务的方式来运行如果当前存在事务就需要把当前的事务挂起来。例如方法A调用方法B方法B会挂起事务A以非事务方式执行。never:就是以非事务执行如果存在事务抛出异常。总是以非事务执行如果存在事务那么就抛出异常。nested:如果当前存在事务就嵌套当前事务中去执行如果当前没有事务那么就新建一个事务类似 requires_new这个样一个传播行为例如方法A中调用了方法BB中try catch手动回滚A不会回滚。Spring IoCIOCInversion of Control 即控制反转将对象交给容器管理我们要考虑谁控制谁控制什么为了是反转哪些方面反转是容器控制了对象主要控制了外部资源及生命周期由容器帮我们查找并注入依赖的对象对象只能被动的接收依赖对象依赖对象的获取被反转了spring中提供了一种IOC容器来控制对象的创建无论是你创建对象处理对象之间的依赖关系对象的创建时间还是对象的创建数量都是spring提供IOC容器上配置对象的信息就可以了。IOC能做什么: 由IOC容器帮对象找相应的依赖思想并注入并不是由对象主动去找资源集中管理实现资源的可配置和易管理降低了使用资源双方的依赖程度解耦合spring用了哪些设计模式简单工厂模式spring中的BeanFactory就是简单工厂模式的体现根据传入一个唯一的标识来获得bean对象但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定工厂方法模式通常由应用程序直接使用new创建新的对象为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。单例模式保证一个类仅有一个实例并提供一个访问它的全局访问点。spring中的单例模式完成了后半句话即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例这是因为spring管理的是是任意的java对象。适配器模式在Spring的Aop中使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式对类进行方法级别的切面增强即生成被代理类的代理类 并在代理类的方法前设置拦截器通过执行拦截器重的内容增强了代理方法的功能实现的面向切面编程。包装器模式spring中用到的包装器模式在类名上有两种表现一种是类名中含有Wrapper另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。6.代理模式为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似但Proxy是控制更像是一种对功能的限制而Decorator是增加职责。7.观察者模式定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。8.策略模式定义一系列的算法把它们一个个封装起来并且使它们可相互替换。这个模式使得了算法可独立于使用他的客户而变化。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1hospringboot常用注解RestController 修饰类该控制器会返回Json数据RequestMapping(“/path”) 修饰类该控制器的请求路径Autowired : 修饰属性按照类型进行依赖注入PathVariable : 修饰参数将路径值映射到参数上ResponseBody :修饰方法该方法会返回Json数据RequestBody需要使用Post提交方式 :修饰参数将Json数据封装到对应参数中ControllerServiceCompont: 将类注册到ioc容器