Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理?

Worker线程在执行的过程中,有一部计算时间需要占用CPU,另一部分等待时间不需要占用CPU,通过量化分析,例如打日志进行统计,可以统计出整个Worker线程执行过程中这两部分时间的比例,例如:线程计算和等待的时间是1:1,即有50%的时间在计算(占用CPU),50%的时间在等待(不占用CPU):

1)假设此时是单核,则设置为2个工作线程就可以把CPU充分利用起来,让CPU跑到100%

2)假设此时是N核,则设置为2N个工作现场就可以把CPU充分利用起来,让CPU跑到N*100%

结论:

N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x 也就是: N * (1+y/x),能让CPU的利用率最大化, 等待时间越长,线程数就可以越多。

30分钟不支付订单自动取消如何来实现?

技术方案

  • 定时任务每秒扫库(不推荐,对数据库的压力比较大)
  • Redisson(延迟消息的数量少的时候可用)
  • MQ
    • RabbitMQ延迟交换机插件
    • RocketMQ延迟消息
    • EMQ 延迟消息

具体的业务逻辑

创建订单完成以后,向RabbitMQ的延迟交换机发送延迟30分钟的消息,消息中存放了订单的id。
30分钟以后,消息到期会从MQ出队,消费者收到这个消息以后,根据消息中的订单id查询数据
库,检查订单的状态,如果是已经支付什么事情也不需要做,如果是未支付,则把订单状态
修改成已取消。

项目中用过AOP吗?如何用的?AOP底层的实现原理

如何来使用?

  • @Datasource做数据源切换
  • @Log记录用户的操作日志
  • @Lock 分布式锁

实现原理

  • springboot 2.0之前,目标类如果实现了接口,则使用JDK动态代理方式,否则通过CGLIB子类的方式生成代理。
  • springboot 2.0版本之后,如果不在配置文件中显示的指定spring.aop.proxy-tartget-class的值,默认情况下生成代理的方式为CGLIB

@Transantional失效的场景中,this内部调用会失效的解决办法

  • @EnableAspectJAutoProxy(exposeProxy = true) + AopContext.currentProxy()
  • @Lazy + 注入bean本身
    @Service
    public class AopService {
    
        @Autowired
        @Lazy
        private AopService selfService;
    
        public void f1(){
            // f2()的事务会失效
            this.f2();
            // 第一种方式
            AopService aopService = (AopService)AopContext.currentProxy();
            aopService.f2();
            // 第二种方式
            selfService.f2();
        }
    
        @Transactional(rollbackFor = Exception.class)
        public void f2(){
            log.info("some business logic in f2()");
        }
    
    }

项目中的安全是如何来做的?项目如何防止sql注入攻击、xss攻击?CSRF漏洞?

防止xss主要就是对一些特殊字符做替换。

我们是写了一个Filter,在Filter中会把原始的HttpServletRequest替换成我们自定义的一个Request,我们在这个自定义的Requst中去做了特殊字符的替换,主要是替换掉比如

防止sql注入主要就是使用SQL的预编译。

有没有遇到过OOM?生产环境内存溢出怎么处理?

1)导出JVM内存映像

  • 当发生内存溢出的时候自动导出,需要添加jvm的启动参数
     -XX:+HeapDumpOnOutOfMemoryError
     -XX:HeapDumpPath=./
  • 手动导出
      jmap -dump:format=b,file=heap.hprof [pid]

2)使用MAT之类的工具分析内存泄漏的原因

  • Histogram: 查看某个对象的数量
  • Dominator Tree:查看某个对象占的内存大小以及引用关系
  • Top Consumers:查看占内存最大的对象

生产环境CPU利用率(负载load)500%如何处理?

  • ps -ef | grep java 找到你的java进程
  • top -Hp pid 找到耗cpu高的线程
  • printf %x 十进制转化成16进制
  • jstack pid 打印线程堆栈
  • 在堆栈中找到cpu高的线程

Excel导出几十万条记录超时怎么办?

客户端点击导出按钮以后,服务端记录一个日志,状态是待处理,给客户端返回日志的id,然后服务端异步做excel的导出,完成以后,把excel上传到oss,把下载的url地址记录到日志,并把日志的状态改成已完成。

客户端拿到这个id以后可以到服务端的一个单独的页面上做查询,如果是已完成,则可以点击下载按钮去下载excel。

十万个修改数据同时来了,十万个新增数据?

  • MQ削峰

    • 请求先放到MQ,给客户端返回:正在排队中…
    • 客户端起定时任务,向服务端轮询执行结果
  • Redis预减

    //请求url:/miaosha/product/12234
    //服务端controller:
    @PostMapping(“/product/miaosha/{productId}”)
    public boolean miaosha(@PathVariable(“productId”) long productId){
    // 秒杀活动开始之前,把商品id和商品的库存数量加载到redis中,key:商品id,value:库存数量
    // redis预减库存,让1万个人去抢数据库中的10个商品是没有意义的,只让10个人去抢就可以了
    int count = redisTemplate.decr(“”+productId);
    if(count <= 0){
    // 秒杀失败
    return false;
    }
    //预减成功以后, 再放入MQ,返回给前端排队中
    kafkaTemplate.send(productId);
    // 从MQ收消息,下单,SQL中要加上stock>0的判断,防止把库存扣成负数
    select * from product where id = #{productId} //version
    int ret = update product set stock=stock-1 where id = #{productId} and stock>0
    if(ret > 0){
    // 秒杀成功,生成订单
    return true;
    }else{
    // 秒杀失败
    return false;
    }
    }

  • 验证码,非常复杂,防止机器人刷接口,减少瞬间的并发

  • 活动开始之前换接口,换页面,防机器人

  • 回仓

  • 卖不完是允许的,卖超是不允许的!!

参考秒杀功能

有没有搭建过ES的集群?

主要就是设置了每一个节点的名称、集群的名称、启动的端口、数据存储路径以及其他节点的IP和端口,集群名称一样的话,他们就能组成一个集群。

    services:
      es01:
        image: elasticsearch:7.12.1
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic

jdk8为啥要用红黑树?

红黑树是一种自平衡二叉搜索树,因此查找和插入操作的时间复杂度为 O(log n),而链表的时间复杂度为 O(n)。在哈希冲突比较严重的情况下,使用红黑树能够更快地进行搜索和插入操作。

在这里插入图片描述

  • 红黑树是”近似平衡“的。
  • 红黑树相比avl树,在检索的时候效率其实差不多,都是通过平衡来二分查找。但对于插入删除等操作效率提高很多。红黑树不像avl树一样追求绝对的平衡,他允许局部很少的不完全平衡,这样对于效率影响不大,但省去了很多没有必要的调平衡操作,avl树调平衡有时候代价较大,所以效率不如红黑树,在现在很多地方都是底层都是红黑树的天下啦。
  • 红黑树的高度只比高度平衡的AVL树的高度(log2n)仅仅大了一倍,在性能上却好很多。
  • HashMap在里面就是链表加上红黑树的一种结构,这样利用了链表对内存的使用率以及红黑树的高效检索,是一种很happy的数据结构。
  • AVL树是一种高度平衡的二叉树,所以查找的效率非常高,但是,有利就有弊,AVL树为了维持这种高度的平衡,就要付出更多代价。每次插入、删除都要做调整,就比较复杂、耗时。所以,对于有频繁的插入、删除操作的数据集合,使用AVL树的代价就有点高了。
  • 红黑树只是做到了近似平衡,并不严格的平衡,所以在维护的成本上,要比AVL树要低。
  • 所以,红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树。

ES如何与Mysql数据保持一致?

ES与MySQL的数据同步分成了3部分:

  • 全量同步
    系统上线之前,首先会做一次全量同步,把mysql中的数据批量的导入到ES中。
  • 增量同步
    常见的增量同步的方式有很多,比如:
    • 同步双写
      • 耦合严重
      • 性能问题
    • 异步双写
      • 松耦合
      • 依赖MQ的可靠性,有可能丢消息
    • 监听binlog
      • 无耦合
      • 技术门槛比较高

我们的系统中是使用的基于MQ的异步双写来实现数据同步的,具体来说,当mysql数据发生变化的时候,会向MQ中发一个消息,然后我们的搜索服务会接收这个消息,根据消息中的数据Id构造出完整的数据,然后同步到ES中。

  • 定时任务全量同步

为了提高MQ的性能,我们没有对消息的可靠性做特殊处理,因此理论上会存在消息丢失导致数据不一致的风险,所以,我们有一个定时任务,每周会把mysql中的数据全量的再导入一次ES,如果这中间发现不一致,人工手动处理。

linux跑了两个docker容器,怎么让两个docker进行通讯

  • 两个容器都使用host网络模式,就可以使用主机的ip和端口进行通信
      // 启动两个容器
      docker run --name d1 --network=host -e port=8081 -d demo
      docker run --name d2 --network=host -e port=8082 -d demo
      // 进入d1容器,执行telnet命令
      docker exec -it d1 sh
      telnet 192.168.137.138 8082 
      GET /demo 正常输出
  • 两个容器连接到同一个网络模式是bridge的自定义网络上,可以使用容器名进行通信
      docker network create mynet
      // 启动两个容器
      docker run --name d3 --network=mynet -e port=8083 -d demo
      docker run --name d4 --network=mynet -e port=8084 -d demo
      // 进入d3容器,执行telnet命令
      docker exec -it d3 sh
      telnet d4 8084
      GET /demo 正常输出
  • 测试用的Dockerfile和接口如下:
      //Dockerfile
      FROM java:8-alpine
      COPY ./demo.jar /tmp/app.jar
      ENV port 8080
      EXPOSE $port
      ENTRYPOINT java -Dserver.port=$port  -jar /tmp/app.jar
      // 接口
      @RestController
      public class DemoController {
          @GetMapping("/demo")
          public String demo() {
              return "demo";
          }
      }
      //docker-compose.yml
      version: '3.9'
      services:
        d1:
          image: demo
          environment:
            port: '8081'
          ports:
            - '8081:8081'
          container_name: d1
          hostname: d1
        d2:
          image: demo
          environment:
            port: '8082'
          ports:
            - '8082:8082'
          container_name: d2
          hostname: d2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240113斐波那切数列

代码 def fibonacci(n):fib_list [0, 1] # 初始的斐波那契数列&#xff0c;包含0和1while len(fib_list) < n:next_number fib_list[-1] fib_list[-2]fib_list.append(next_number)return fib_list[:n]# 示例&#xff1a;计算前10个斐波那契数 n 10 result fibonacci…

jmeter--2.常用组件以及作用域

目录 1.常用的组件以及执行顺序 2.常用的组件作用 2.1 测试计划&#xff1a;jmeter启动&#xff0c;其它组件的容器 2.2 线程组&#xff08;测试片段&#xff09;&#xff1a;代表一定虚拟用户数&#xff0c;测试片段代表模块 2.3 配置元件&#xff1a;配置信息 2.4 前置处…

文心一言 VS 讯飞星火 VS chatgpt (177)-- 算法导论13.3 6题

六、用go语言&#xff0c;说明如果红黑树的表示中不提供父指针&#xff0c;应当如何有效地实现 RB-INSERT。 文心一言&#xff1a; 红黑树是一种自平衡的二叉搜索树&#xff0c;其中每个节点都包含一个颜色属性&#xff08;红色或黑色&#xff09;&#xff0c;并且满足以下性…

对自动化测试断言的思考

断言在自动化测试中起着关键的作用&#xff0c;它是验证测试结果是否符合预期的重要手段。如果在自动化测试过程中忽视了断言&#xff0c;那么这个测试就失去了其本质的意义&#xff0c;因为我们无法得知测试结果是否达到了预期的效果。因此&#xff0c;断言在自动化测试中的重…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger&#xff08;触发器&#xff09;、Job&#xff08;任务&#xff09;和Scheduler&#xff08;调度器&#xff09;&#xff0c;定时任务的逻辑大体为&#xff1a;创建触发器和任务&#xff0c;并将其加入到调度器中&#xff0c;如下图所…

【服务器】服务器管理 - cockpit开启

开启cockpit #!/bin/bashsed -i s/is():where()/is(*):where(*)/ /usr/share/cockpit/static/login.jssystemctl enable --now cockpit.socket #开启cockpit服务systemctl start cockpit.socket 登录 https://ip:9090

03.分支结构

分支结构 应用场景 迄今为止&#xff0c;我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家获得1000分&#xff0c;那…

uniapp-uniCloud的基本使用(编写云存储的地区级联选择器)

目录 新建项目&#xff0c;创建 uniCloud 服务空间并关联 1. 新建项目 2. 创建 uniCloud 服务空间并关联 manifest.json内未配置Appld,请重新获取后再 云数据库的使用 城市选择和云数据库 介绍 云端数据 DB Schema概述 新建项目&#xff0c;创建 uniCloud 服务空间并关…

【机器学习300问】4、机器学习到底在学习什么?

首先我们先了解一个前置问题&#xff0c;再回答机器学习到底在学习什么。 一、求机器学习问题有哪几步&#xff1f; 求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段。首先&#xff0c;在学习阶段进行模型的学习&#xff0c;然后&#xff0c;在推理阶段用学到的模型…

实现秒杀功能设计

页面 登录页面 登录成功后&#xff0c;跳转商品列表 商品列表页 加载商品信息 商品详情页 根据商品id查出商品信息返回VO&#xff08;包括rmiaoshaStatus、emainSeconds&#xff09;前端根据数据展示秒杀按钮&#xff0c;点击开始秒杀 订单详情页 秒杀页面设置 后端返回秒杀…

1.12 力扣中等图论

797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节…

Window Docker安装

1.下载安装Docker 在Windows上安装Docker桌面_Docker中文网 (dockerdocs.cn)https://dockerdocs.cn/docker-for-windows/install/index.html2.安装完&#xff0c;修改镜像 Docker——Windows版本Docker安装_docker windows-CSDN博客https://blog.csdn.net/weixin_51351637/ar…

基于Linux的Flappy bird游戏开发

项目介绍 主要是使用C语言实现&#xff0c;开启C项目之旅。 复习巩固C语言、培养做项目的思维。 功能&#xff1a; 按下空格键小鸟上升&#xff0c;不按下落&#xff1b; 显示小鸟需要穿过的管道&#xff1b; 小鸟自动向右飞行&#xff1b;&#xff08;管道自动左移和创建&a…

训练营第四十二天 | 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包问题 二维 代码随想录 dp二维数组 优化 01背包问题 一维 代码随想录 dp一维数组 416. 分割等和子集 把数组分成总和相等的两份&#xff0c;如果数组总和为奇数&#xff0c;不能分割&#xff0c;若有符合的数组子集&#xff0c;返回true 代码随想录 class Solution {p…

Java内存模型之原子性

文章目录 1.什么是原子性2.Java中的原子操作有哪些3.long和double的原子性4.原子操作 原子操作 ! 原子操作 1.什么是原子性 一系列的操作&#xff0c;要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不会出现执行一半的情况&#xff0c;是不可分割的。 注意&#x…

Android perfetto memory开源工具分析

目录 原理 官网链接 下载heap_profile producer_support.cc 本地编译 push heapprofd 工具使用 pb文件获取 打开*.pb文件 trace文件 提高系统CPU性能 拆解特定函数内存占用 环境配置 工具使用 修改heap_profile 脚本 原理 Android perfetto memory分析工具和ma…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#xff08;2&#xff09; 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上&#xff0c;增加一个功能&#xff0c;当手指在上面的图片…

如何使用SVN查看旧版本

和目录 第一步&#xff1a;打开SVN客户端 第二步&#xff1a;浏览历史版本 第三步&#xff1a;还原历史版本 结论 Subversion (缩写为SVN)是一种常用的版本控制系统&#xff0c;它可以帮助团队协作开发软件项目。除了基本的版本控制功能外&#xff0c;SVN还提供了许多其他功…

【已解决】如何用递归实现位运算计算两数之和

本博文源于笔者正在思考的如何用递归进行计算两数之和。读者一般都会想到用while循环进行操作&#xff0c;位运算两数之和的思想就犹如辗转相除法。文章并附加了对这个方法的流程演示 问题来源 想要用递归实现两数之和。 代码实现 #include<stdio.h> int add(int num…

(十)IIC总线-PCF8591-ADC/DAC

文章目录 IIC总线篇起始&#xff0c;终止信号应答信号发送&#xff0c;读取数据IIC通讯规则 PCF8591-ADC-DAC篇特性一般说明地址Control byte&#xff08;控制字&#xff09;简单了解一下DAC电阻分隔链应用为王DAC的应用如何设置DAC输出如何调用DAC功能 ADC的应用ADC采集特点AD…