5年java开发经验总结面试题-内含完整答案

news2026/3/28 4:40:02
1、讲讲IO里面的常见类字节流、字符流、接口、实现类、方法阻塞。文件字节输入输出流 FileInputStream/FileOutputStream文件字符流 FileReader/FileWriter包装流PrintStream/PrintWriter/Scanner字符串输入输出流StringReader/StringWriter转换流InputStreamReader/OutputStreamReader缓存流BufferedReader/BufferedWriter BufferedInputStream/BufferedOutputStreamFlushable接口、Appendable接口、Readable接口同步阻塞IO在此种方式下用户进程在发起一个IO操作以后必须等待IO操作的完成只有当真正完成了IO操作以后用户进程才能运行。异步阻塞NIO此种方式下是指应用发起一个IO操作以后不等待内核IO操作的完成等内核完成IO操作以后会通知应用程序这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成2、讲讲NIO。3、递归读取文件夹下的文件代码怎么实现不好描述设计一个方法传入文件路径判断是否为空不为空new File(testFileDir).listFiles();然后再判断空最后遍历是文本文件还是文件目录4、常用的线程池模式以及不同线程池的使用场景newCachedThreadPool 执行很多短期异步的小程序或者负载较轻的服务器newFixedThreadPool 执行长期的任务性能好很多newSingleThreadExecutor 一个任务一个任务执行的场景NewScheduledThreadPool 周期性执行任务的场景线程池任务执行流程当线程池小于corePoolSize时新提交任务将创建一个新线程执行任务即使此时线程池中存在空闲线程。当线程池达到corePoolSize时新提交任务将被放入workQueue中等待线程池中任务调度执行当workQueue已满且maximumPoolSizecorePoolSize时新提交任务会创建新线程执行任务当提交任务数超过maximumPoolSize时新提交任务由RejectedExecutionHandler处理当线程池中超过corePoolSize线程空闲时间达到keepAliveTime时关闭空闲线程当设置allowCoreThreadTimeOut(true)时线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc5、newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办底层原理。设置固定尺寸的线程池、可变尺寸连接池创建线程池方法固定大小的线程池ExecutorService pool Executors.newFixedThreadPool(5)单任务线程池ExecutorService pool Executors.newSingleThreadExecutor()可变尺寸的线程池ExecutorService pool Executors.newCachedThreadPool()延迟连接池ExecutorService pool Executors.newScheduledThreadPool(2)如果当前线程数小于指定的最大数量则创建新的线程执行任务否则加入到缓冲队列workQueue最终是把需要执行的线程放到一个工作线程workers HashSet里面。这里的work与Thread是分离的这样做的好处是如果我们的业务代码需要对于线程池中的线程赋予优先级、线程名称、线程执行策略等其他控制时可以实现自己的ThreadFactory进行扩展无需继承或改写ThreadPoolExecutor6、了解可重入锁的含义以及ReentrantLock 和synchronized的区别从名字上理解ReenTrantLock的字面意思就是再进入的锁其实synchronized关键字所使用的锁也是可重入的两者关于这个的区别不大。两者都是同一个线程没进入一次锁的计数器都自增1所以要等到锁的计数器下降为0时才能释放锁。除了synchronized的功能多了三个高级功能。等待可中断公平锁绑定多个Condition。等待可中断在持有锁的线程长时间不释放锁的时候等待的线程可以选择放弃等待tryLock(long timeout, TimeUnit unit)公平锁按照申请锁的顺序来一次获得锁称为公平锁synchronized的是非公平锁ReentrantLock可以通过构造函数实现公平锁。new RenentrantLock(boolean fair)绑定多个Condition通过多次newCondition可以获得多个Condition对象可以简单的实现比较负责的线程同步的功能通过await(),signal();7、atomicinteger和volatile等线程安全操作的关键字的理解和使用volatile关键字volatile是一个特殊的修饰符只有成员变量才能使用它与Synchronized及ReentrantLock等提供的互斥相比Synchronized保证了Synchronized同步块中变量的可见性而volatile则是保证了所修饰变量的可见性。可见性指的是在一个线程中修改变量的值以后在其他线程中能够看到这个值在Java并发程序缺少同步类的情况下多线程对成员变量的操作对其它线程是透明的不可见。因为volatile只是保证了同一个变量在多线程中的可见性所以它更多是用于修饰作为开关状态的变量。原子操作AtomicVolatile变量可以确保先行关系保证下一个读取操作会在前一个写操作之后发生(即写操作会发生在后续的读操作之前)但它并不能保证原子性。例如用volatile修饰count变量那么count 操作就不是原子性的。8、进程和线程的区别进程是系统资源分配的最小单位线程是程序执行的最小单位一般启动一个进程就会分配一个空间地址建立数据表来维护代码段、堆栈段和数据段进程程序比较健壮一个进程死掉不会影响到其它独立的进程而线程死掉就会影响到整个进程线程是在同一进程下共享全局变量和静态变量进程是以IPC进行的9、同步和异步阻塞和非阻塞同步与异步同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后直接返回做自己的事情IO交给内核来处理完成后内核通知进程IO完成。阻塞与非阻塞应用进程请求I/O操作时如果数据未准备好如果请求立即返回就是非阻塞不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回需要等待就是阻塞否则就可以理解为非阻塞三、设计模式1、简述一下你了解的设计模式。单例模式用于不会频繁创建对象的场景只能创建一个对象节约内存加快对象访问速度工厂模式普通来说就是根据用户需求创建对象对象方法是继承父类过来的适配器模式就是多写一个实现类来继承通过一个适配器类帮需要添加监听器的对象实现了监听器里所有方法;这个对象只需要实现它需要的方法。模板模式相当于模版并没有实现需要具体的使用才能实现(按照一定规律才产生)把几个对象相同的动作抽取到一个接口里在接口定义动作执行顺序;对象执行动作时实现该接口的方法最后创建环境测试对象的执行顺序调用动作方法;代理模式代理一般是指为其他对象提供代理以控制对这个对象的访问某些情形下不适合直接引用目标对象或者不适合在其他对象中引用则可以使用代理模式以增强对主业务逻辑。装饰者模式动态地给一个对象添加一些额外的职责。就增加功能来说Decorator模式相比生成子类更为灵活。享元模式是结构型设计模式的一种是池技术的重要实现方式它可以减少应用程序创建的对象降低程序内存的占用提高程序的性能用于大量出现相似的对象缓冲池观察者模式就是发布订阅模式发布者发布信息订阅者获取信息订阅了就能收到信息没订阅就收不到信息2、写出单利模式懒汉和饿汉四、JVM1、描述一下JVM加载class文件的原理机制装载:查找和导入class文件;检查:载入的class文件数据的正确性;准备:为类的静态变量分配存储空间;解析:将符号引用转换成直接引用(这一步是可选的)初始化:初始化静态变量静态代码块,在程序调用类的静态成员的时候开始执行所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动2、Java 中会存在内存泄漏吗请简单描述。内存泄露就是指一个不再被程序使用的对象或变量一直在内存中占据着java中内存泄露的发生场景通俗地说就是程序员可能创建了一个对象以后一直不再使用这个对象这个对象却一直被引用即这个对象无用但是却无法被垃圾回收器回收的这就是java中的内存泄露如果一个外部类的实例对象的方法返回了一个内部类的实例对象这个内部类对象被长期引用了即使那个外部类实例对象不再被使用但由于内部类持久外部类的实例对象这个外部类对象将不会被垃圾回收这也会造成内存泄露。3、GC是什么为什么要有GCGC是垃圾收集的意思用于防止内存泄露有效的利用内存。垃圾回收器通常是作为一个单独的低优先级的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收 4、JVM的内存模型重要、GC算法、新生代、老年代、永久代等需要详细了解新生代。新建的对象都是用新生代分配内存Eden空间不足的时候会把存活的对象转移到Survivor中新生代大小可以由-Xmn来控制也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象持久代Permanent Space实现方法区主要存放所有已加载的类信息方法信息常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区只不过是Hotspot JVM用Permanent Space来实现方法区而已有些虚拟机没有Permanent Space而用其他机制来实现方法区。标记-整理Mark-Compact此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段第一阶段从根节点开始标记所有被引用对象第二阶段遍历整个堆把清除未标记对象并且把存活对象“压缩”到堆的其中一块按顺序排放。此算法避免了“标记-清除”的碎片问题同时也避免了“复制”算法的空间问题。5、GC的工作原理GC通过每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收GC是后台的守护进程对于Java程序员来说分配对象使用new关键字释放对象时只要将对象所有引用赋值为null让程序不能够再访问到这个对象我们称该对象为不可达的.GC将负责回收所有不可达对象的内存空间。对于GC来说当程序员创建对象时GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录和管理堆heap中的所有对象。通过这种方式确定哪些对象是可达的哪些对象是不可达的.当GC确定一些对象为不可达时GC就有责任回收这些内存空间。但是为了保证GC能够在不同平台实现的问题Java规范对GC的很多行为都没有进行严格的规定。例如对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定。因此不同的JVM的实现者往往有不同的实现算法。这也给Java程序员的开发带来行多不确定性。五、数据库1、事务的ACID是指什么原子性(Atomicity): 操作过程不可分割,要么都成功要么都失败一致性(Consistency):事物操作之后操作前后数据不变;比如转账减少的跟增加的值不变隔离性(Isolation): 多个事物之间的操作是分隔的互不干扰如果有多个事务去操作同一个数据的时候就会事务并发问题(抢购 秒杀 等)持久性(Durability): 成功的完成一个事物处理后最终commit把数据将永久保存在数据库;2、悲观锁和乐观锁的区别悲观锁 就是很悲观每次去拿数据的时候都认为别人会修改每次获取数据前都要被加锁乐观锁 就是很乐观每次去拿数据的时候都认为别人不会修改不会加锁但是每次更新时都要判断是否被修改过可以使用版本号判断3、Left join、right join、inner join区别left join(左联接) 返回包括左表中的所有字段记录、只返回右表中和左表交集的记录不匹配的部分显示nullright join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录不匹配的部分显示nullinner join(等值连接) 只返回两个表中联结字段相等的行4、SQL优化DDL优化变多次索引维护为一次索引维护:插入数据禁用索引插入后再开启变多次唯一校验为一次唯一校验:关闭唯一校验批量插入数据插入后开启变多次事务提交为一次事务提交:把多条插入语句合并为一条在SQL中避免where或order by后经常出现的字段上建索引出现、is null、in、not in、避免在 where 子句中使用 or 来连接条件、like前置匹配都会变成全表扫描索引失效5、redis缓存数据库需要了解什么是内存数据库支持的数据类型把经常使用的数据存放在内存中全局共享减少和数据库之间的交互频率提升数据访问速度主要用于应用程序全局共享缓存常见的内存数据库有Redis、memcached、FastDB支持的常用数据类型可以是键值对数据结构的value支持各种数据类型6、单个索引、联合索引、主键索引单个索引就是在一个列上面创建索引联合索引索引可以覆盖多个数据列如像INDEX(columnA, columnB)索引这就是联合索引。主键索引设定主键而创建的索引把某个列设为主键的时候数据库就会給改列创建索引(主键非空且唯一)7、索引的数据结构B-树、B树、R-树、散列B-树结构支持插入、控制操作以及通过管理一系列树根状结构的彼此联通的节点中来做选择。B-树结构中有两种节点类型索引节点和叶子节点。叶子节点是存储数据的而索引节点是用来告诉用户存储在叶子节点中的数据的顺序并帮助用户找到数据。B树是B-树结构的增强版尽管B树支持B-树的所有特性他们之间最显著的不同点在于B树中底层数据是按照提及的索引列进行排序的。B树还通过在叶子节点之间附加引用来优化扫描的性能。散列表数据结构是一个简单的概念他将一种算法应用到给定值中以在底层数据存储系统中返回一个唯一的指针或位置。散列表的优点是始终以线性时间复杂度找到需要读取的行的位置而不想B-树那样需要跨越多层节点来确定位置。R-树数据结构支持基于数据类型对集合数据进行管理。目前只有MyIsam使用R-树支持空间索引。使用空间索引也有很多限制比如只支持唯一的NOT NULL列等。空间索引并不常用。8、数据库的锁行锁、表锁、悲观锁、乐观锁表锁偏向yISAM存储引擎开销小加锁快无死锁锁定粒度大发生锁冲突的概率最高并发度最低偏向InnoDB存储引擎开销大加锁慢会出现死锁锁定粒度小发生锁冲突的概率最低并发度最高。InnoDB与MyISAM的最大不同有两点一是支持事务二是彩了行级锁悲观锁进行业务操作前先加锁即一锁二查三更新。乐观锁先进行业务操作不到万不得已不去拿锁。六、框架1、web Service 常用注解 客户端如何生成还是手写WebServiceserviceName“PojoService”, portName“PojoPort”, name“PojoPortType”, targetNamespace“http//:Pojo”serviceName 对应portName 对应 下的name 对应targetNamespace 对应 targetNamespace“http//:Pojo”定义schemaLocation的显示WebMethodoperationName“queryPojo”,excludetrueoperationName 接口的方法名、exclude 用于阻止将某一继承方法公开为web服务默认为falseWebResultname“returnWord” 接口的返回值WebParamname“cityName”接口的参数2、mybatis处理大数据分表分为水平分表(hash分表、时间、区间分表)、垂直分表(不常用字段单独表)比如区间分表有跨表查询情况使用关键字 union union all3、AOP IOC优点缺点AOP缺点:性能略低,仅适用于方法调用,必须在Spring容器AOP优点:从Ioc容器中直接获得一个对象然后直接使用无需事先创建让逻辑业务分解解耦代码改变了OOP(Object Oriented Programming)面向对象编程的不足IOC缺点:生成一个对象的步骤变复杂了忽略缺少IDE重构的支持如果修改了类名还需到XML文件中手动修改这似乎是所有XML方式的缺憾所在IOC优点:实现组件之间的解耦提高程序的灵活性和可维护性4、spring事务传播属性和隔离级别NEVER 绝对不能有事物,不然报错,有事物的方法调用也不行;REQUIRED 普通方法调用,单开事物,有事物方法调用,就用有事物方法的事物REQUIRES_NEW 无论有没有事物的方法调用 我都坚持执行自己的事物SUPPORTS 有事物的方法调用就用你的,没有就没事物Dirty Reads 脏读:客户看到的不是数据库真实数据,解决 事物提交前,不允许其他事物访问修改过的值Phantom Reads 幻像读一个事务读取到另一个事务里已插入的数据 解决 其他事物处理完数据前,不允许添加新数据Non-Repeatable Reads 不可重复读 后续读取数据读取到其它事务已提交的更新数据导致前后读取数据不一致,解决 读取数据在修改之后;5、Web Service 客户端和服务端实现技术待定…6、Spring Mvc返回json技术第一种 每个json视图controller配置一个Jsoniew第二种 使用JSON工具将对象序列化成json常用工具Jacksonfastjsongson第三种 利用spring mvc3的注解ResponseBody7、Hibernate悲观锁和乐观锁Hibernate悲观锁在数据有加载的时候就给其进行加锁直到该锁被释放掉其他用户才可以进行修改优点数据的一致性保持得很好缺点不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候这个资源永远不会被其他用户进行修改容易造成无限期的等待。Hibernate乐观锁就是在对数据进行修改的时候对数据才去版本或者时间戳等方式来比较数据是否一致性来实现加锁。优点比较好。8、Hibernate三种状态临时状态:new的对象还未持久化还没处于Session中持久状态:已经持久化加入到session缓存冲处于此状态的对象叫持久对象游离状态:持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点已经持久化但不在Session缓存中。处于此状态的对象叫游离对象9、hibernate和ibatis的区别ibatis:开源项目上手简单开发灵活,开发工作量大,大多自己写sql,很多配置文件Hibernate:开源的对象关系映射框架,开发效率高,但不能干扰sql,做优化程度较低10、讲讲mybatis连接池常见的mybatis连接池有原生、c3p0、dbcp三类通过工厂模式创建DataSource接口它的实现有unpooledDataSource(不带连接池的数据源)PooledDataSource(带连接池的数据源)它们都可以通过对应的工厂类对象获取拿PooledDataSource来说的话首先:需要一个连接数据库的对象在执行SQL语句的时候获取java.sql.Connection连接对象其次:PooledDataSource数据源将Connection连接池对象包裹成PooledConnection对象放到了PoolState类型的容器中维护。 MyBatis将连接池中的连接池dui分为两种状态 空闲状态idle和活动状态(active)PooledConnection对象分别被存储到PoolState容器内的idleConnections和activeConnections两个List集合中空闲(idle)状态就把PooledConnection对象被放置到idleConnections集合中表示当前闲置的没有被使用的PooledConnection集合调用PooledDataSource的getConnection()方法时会优先从此集合中取PooledConnection对象。当用完一个java.sql.Connection对象时MyBatis会将其包裹成PooledConnection对象放到此集合中。活动(active)状态下把PooledConnection对象被放置到名为activeConnections的ArrayList中表示当前正在被使用的PooledConnection集合调用PooledDataSource的getConnection()方法时会优先从idleConnections集合中取PooledConnection对象,如果没有则看此集合是否已满如果未满PooledDataSource会创建出一个PooledConnection添加到此集合中并返回11、SpringMVC的工作原理用户发送请求,被前端控制器DispatcherServlet捕获拦截;DispatcherServlet调用HandlerMapping处理器映射管理对象获得Handler处理器;DispatcherServlet根据Handler去获取适合的适配器HandlerAdpterHttpMessageConveter将请求信息转换成指定的响应对象;有了适配器,把请求参数填充到Handler,spring就开始执行Handler(Controller)进行数据转换、数据验证、数据格式化操作Handler执行完之后,向DispatcherServlet返回一个ModelAndView对象;根据返回的ModelAndView选择一个合适的ViewResolver视图解析器,找到ModelAndView指定的视图;ViewResolver结合Model、View渲染显示页面;12、Spring的几种注入方式注解注入、setter注入、构造器注入13、Spring如何实现事务管理编程式事务管理将事务管理代码嵌入到业务方法中来控制事务的提交和回滚在编程式事务中必须在每个业务操作中包含额外的事务管理代码声明式事务管理使用spring aop拦截器实现14、Spring IOC和AOP的原理IOC主要是帮我们创建对象和管理bean的容器它控制反转就是把创建对象的权力交给ioc容器(spring容器)启动spring的时候把xml和其它配置文件加载信息到ioc容器ioc再建立注册信息表来管理再通过注册表实力化成bean把bean放到spring容器bean缓冲池(hashMap实现)然后使用bean直接从缓存池取记住:spring的配置文件用于描述bean关系的利用反射功能建立bean依赖关系Spring AOP底层是动态代理动态代理分为jdk代理和cglib代理jdk代理要求代理的类必须有父类接口它主要通过Proxy和InvocationHandler接口实现InvocationHandler接口并实现它的invoke方法该方法传入参数有接口对象和接口方法然后通过反射创建代理对象(需要传入两个参数一个是当前调用类的实例一个是实现InvocationHandler的实例并传入接口)七、Linux基础1、常用命令解压文件 tar -zxvf 文件名.tar.gzrm -rf 文件名或文件名/* 强制暴力删除tail -n 3 -f 1.txt //动态显示文件后3行内容查看最新日志实时更新mv 文件1 文件2 移动文件命令ls -l //以详细信息方式列出文件信息ls 目录名 //查看该目录的文件信息whoami //查看当前操作用户who am i //查看当前登录用户(有可能是有多个的)的信息su - root //切换到root用户和su - 一样mkdir 目录名 //创建一个目录mkdir -p 目录1/目录2/目录3 //递归创建目录cp -rf dir1/* dir2 //直接复制内容非常重要echo hello 1.txt //以覆盖写的方式将hello字符添加到文件1.txtecho world 1.txt //以追加的方式将world字符添加到文件1.txtcat 2.txt 1.txt //将2.txt文件的内容覆盖到1.txtcat 2.txt 1.txt //将2.txt文件的内容追加到1.txtubuntu远程访问Linux的终端常用命令ssh localhost 判断是否安装远程服务安全协议命令sudo apt-get install openssh-server 安装ssh的服务器端命令sudo apt-get update 更新软件源命令sudo /etc/init.d/ssh restart 启动ssh-server命令sudo passwd root 设置root密码命令su root 命令行切换到root命令sudo gedit 文件路径 修改文件命令2、Linux文件权限对Linux文件权限的理解 - 0xcafedaddy - 博客园3、端口占用netstat -ano列出所有端口的情况netstat -aon | findstr 端口号 占用查看taskkill /pid 被占用端口号 /F 解除端口占用九、项目经验面试真题1、浏览器访问www.taobao.com经历了怎样的过程。待定...2、高并发情况下我们系统是如何支撑大量的请求的一、使用消息队列来存放请求二、可以做多机集群利用负载均衡原理分配每个数据库的职责三、使用Redis缓存减少对数据库的请求访问能使用静态页面的地方尽量使用减少容器的解析尽量将动态内容生成静态html来显示3、集群如何同步会话状态一般集群都是主从数据库原则在主方会配置一个授权账号生成的二进制文件传入的数据都保存到二进制文件上从方会用根据授权账号信息读取二进制文件进行写操作写到它自己的文件下4、负载均衡的原理会向外暴露虚拟的端口号和ip在配置文件里会设置一个共享账号来管理集群并且根据ip分配职责当有请求的时候会判断什么业务操作根据业务不同可以分发不同的数据库访问路径做到读写分离负载均衡器一般还有备用均衡器防止单点故障5、如果有一个特别大的访问量到数据库上怎么做优化DB设计DBIOSQL优化Java优化设计缓存使用memcached、redis读写分离数据库优化优化表结构、索引、查询语句等使用集群升级硬件6、手写斐波那契数列、递归查找文件7、Mybatis的# $的区别#生成sql是双引号拼接的数据$是直接显示数据#可以防止注入不能但在中就要使用8、prototype作用域的范围9、Spring的动态代理动态代理模式jdk代理要求代理的类必须有父类接口它主要通过Proxy和InvocationHandler接口实现InvocationHandler接口并实现它的invoke方法该方法传入参数有接口对象和接口方法(通过反射调用方法)然后使用spring的Proxy类创建代理对象时传入两个参数一个是当前调用类的实例一个是实现InvocationHandler的实例并传入接口篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc10、手写生产者消费者模式比如dubbo的提供者和消费者关系11、分布式锁12、死锁的原因以及如何避免原因 当多个线程争夺资源造成的比如买包子你坚决买完包子再付钱而老板坚决付完钱再卖双方都不退让造成死锁加锁顺序 确保所有的线程都是按照相同的顺序获得锁死锁检测(每当一个线程获得了锁会在线程和锁相关的数据结构中map、graph等等将其记下。除此之外每当有线程请求锁也需要记录在这个数据结构中)加锁时限(在尝试获取锁的时候加一个超时时间这就是在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求)13、内存溢出的常见原因 java.lang.OutOfMemoryError: …java heap space…一 堆栈溢出数据得不到释放访问量比较大比较久垃圾回收器认为都是可用的数据不去回收从而导致内存溢出溢出之前关键字报错java.lang.OutOfMemoryError:GC over head limit exceeded二 PermGen的溢出可能是第三方包、代码、常量多或者通过动态代码加载等方法导致常量池的膨胀常用的手段是增加-XX:PermSize和-XX:MaxPermSize的大小。三 可能是地址空间不够而导致java.lang.OutOfMemoryError: request {} byte for {}out of swap四 无法为线程分配一块内存区域这个要么是内存本身就不够要么heap的空间设置得太大了导致了剩余的内存已不够线程本身要占用内存 java.lang.OutOfMemoryError: unable to create new native thread五 -Xss太小 java.lang.StackOverflowError14、秒杀系统的设计简单模拟的秒杀场景源码:sec-kill-demo.rar_免费高速下载|百度网盘-分享无限制大概思路刚开始的时候是通过页面ajax请求访问到后台调用创建订单方法先根据id查询出总库存数销售初始值是0如果总库存减去销售初始值0小于等于0的不满足就对库存1然后更新数据库返回一个result判断result大于0就有库存调用insert方法但有个安全问题就是当高并发的时候有可能拿到的是同一个数字去同时调用update方法更新数据库然后就有些没有得到为了解决这个问题当时他把悲观锁改变成乐观锁就是通过版本号判断当满足还有库存的情况下多个线程访问到同一地方当第一个线程先调用update方法对version加1库存字段1当第二个线程进来时发现版本号改变了就找不到了这样就保证了每个线程调用不一样的但乐观锁不能解决高并发带来的问题最后利用了redis的lpop的特点当对一个集合存入多个值可以通过lpop把集合里的数据挨个儿弹出lpop可以用来做抢购码对redis的api基本操作方法做了封装直接调用就行了做那块主要写了两个方法一个得到抢购码的方法通过redis工具调用lpop方法弹出一个抢购码返回出去并且通过前台传入的产品id结合用户存入到lset集合里作为日志因为我们要查看哪个用户抢到了还有一个方法就是用于生成抢购码的它有两个参数一个是要生成多少抢购码随机数count、第二个参数是用户id创建一个存储抢购码的listcode容器通过循环count和UUID生成抢购码调用add添加到listcode集合里在循环外面通过redis工具调用lsetList方法把listcode作为value把用户id作为key。15、100万条记录实现导出JAVA使用POI如何导出百万级别数据_java poi百万级数据导出-CSDN博客16、字符串的比较、反转使用 如果地址一样则返回true否则false使用equals 如果内容一样则返回true否则false使用compareTo 从开头字母比较比较各个字符的 Unicode 值比较结果如果是负数说明第一个数小于第二个如果是整数说明大于第二个如果返回的是0说明比较值相等通过StringBuiler的reverse()的方法最快的方式通过String类的charAt()的方法来获取字符串中的每一个字符然后将其拼接为一个新的字符串17、CountDownLatch的应用场景CountDownLatch是一个辅助类能够使一个线程等待其他线程完成各自的工作后再执行比如跑步比赛第一名必须等待其它选手到达才统计排名CountDownLatch是通过一个计数器来实现的计数器的初始值为线程的数量。每当一个线程完成了自己的任务后计数器的值就会减1。当计数器值到达0时它表示所有的线程已经完成了任务然后在闭锁上等待的线程就可以恢复执行任务18、使用Redis遇到的问题缓存穿透,瞬间并发,缓存雪崩如何解决的缓存穿透就是多个用户同时去redis请求数据没有查询到就要去数据库查询数据库没有就不做缓存导致每次请求都要去数据库访问解决:缓存空对象. 将 null 变成一个值缓存雪崩就是redis里的数据有效时间同时失效然后去查询数据库所有的查询都落在数据库上造成雪崩解决:加锁排队. 限流、缓存永远不过期、做二级缓存或者双缓存策略19、实现SpringMvc拦截器的哪些方式有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器mvc:interceptors和mvc:interceptor即可20、如何解决跨域问题一、动态创建scriptscript标签不受同源策略的限制二、后端转发请求三、JSONP的回调函数和数据。回调函数是当响应到来时要放在当前页面被调用的函数。数据就是传入回调函数中的json数据也就是回调函数的参数了21、如何解决掉电数据丢失问题设置自动保存数据时间只要有1个key改变 就保存数据文件启动redis服务就开始记录服务器执行的所有写操作命令并在服务器启动时通过重新执行这些命令来还原数据集,默认关闭该模式;默认开启的appendonly yes yes 开启,no 关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2456776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…