常见 BUG 问题面试系列-01

1. 应用服务 8080 端口被意外占用如何解决?

1)按键盘WIN+R键,打开后在运行框中输入“CMD”命令,点击确定。

2)在CMD窗口,输入“netstat -ano”命令,按回车键,即可查看所有的端口占用情况。

3)找到本地地址一览中类似“0.0.0.0:8080”信息,通过此列查看8080端口对应的程序PID。

4)打开任务管理器,详细信息找到对应的应用PID(若不存在通过设置可以调出来),右键结束任务即可。

2. JSP 获取 ModelAndView 传参数据问题?

Idea开发工具自动创建的web.xml约束太低,导致无法正常获取数据,需要把web.xml约束的信息调整一下,参考如下:

 

3. Linux 运行 SQL 语句文件报错?

原因分析:Linux下MySQL版本不兼容导致的。

解决办法:把文件中所有的utf8mb4_0900_ai_ci替换为utf8_general_ci以及utf8mb4替换为utf8类型。

4. Spring Cloud Config 使用 SSH 连接 GitHub 报错?

Spring Cloud Config使用SSH连 GitHub报错:

JSchException: Auth fail

可以使用命令生成公钥来解决GitHub报错问题,举例如下:

ssh-keygen -m PEM -t rsa -b 4096 -C "java梦睡了@qq.com"

5. 如何解决 Linux 显示中文乱码问题?

在Linux中通过locale来设置程序运行的不同语言环境,locale由 ANSI C提供支持。locale的命名规则为_.,如zh_CN.GBK,zh代表中文,CN代表大陆地区,GBK表示字符集。

修改 /etc/locale.conf文件的内容

LANG="zh_CN.UTF-8"

执行命令,使修改文件立刻生效

source /etc/locale.conf

6. IDEA 中 Maven 项目无法自动识别 pom.xml?

方式一

File->Settings->Build,Excecution,Deployment->Build Tools->Maven->Ignored Files

查看是否存在maven pom被勾选,去掉勾选即可。

方式二

右键项目pom.xml文件,选择“add as maven project”,自动导入pom所依赖的jar包。

刷新Maven配置

右键单击项目,在弹出菜单中选择Maven->Reimport菜单项。IDEA将通过网络自动下载相关依赖,并存放在Maven的本地仓库中。

或者将Maven的刷新设置为自动,单击File|Setting菜单项,打开Settings选项卡,在左侧的目录树中展开Maven节点,勾选Import Maven projects automatically选择项。

7. JSP 模版引擎如何解析 ${} 表达式?

目前开发中已经很少使用JSP模版引擎,JSP虽然是一款功能比较强大的模板引擎,并被广大开发者熟悉,但它前后端耦合比较高。

其次是JSP页面的效率没有HTML高,因为JSP是同步加载。而且JSP需要Tomcat应用服务器部署,但不支持Nginx等,已经快被时代所淘汰。

JSP页面中使用${表达式}展示数据,但是页面上并没有显示出对应数据,而是把${表达式}当作纯文本显示。

原因分析:这是由于jsp模版引擎默认会无视EL表达式,需要手动设置igNoreEL为false。

<%@ page isELIgnored="false" %>

8. 前端传输参数保存数据到 MySQL 中乱码问题?

数据库连接驱动配置参数url添加UTF-8编码:

url:jdbc:mysql://127.0.0.1:3306/JavaJingXuan?useUnicode=true&characterEncoding=UTF-8

9. MySQL 中日期函数时间不准确?

这是由于时区问题导致,首选设置MySQL时区为中国。

需要注意的是MySQL重启后就会恢复默认:

set time_zone='+8:00';

url连接MySQL数据库的时区要和MySQL服务的时区一致,配置参数如下:

characterEncoding=utf-8&serverTimezone=UTC

10. Maven 打包提示 “程序包com.sun.deploy.net不存在” 的问题?

将com.sun.deploy.net.URLEncoder换成java.net.URLEncoder,就可以解决Maven 打包提示 “程序包com.sun.deploy.net不存在” 的问题。

11. thymeleaf 模板引擎在 Linux 解析报 500 问题?

Spring Boot项目中集成了thymeleaf模版引擎本地正常运行没任何问题,但是放到Linux系统后出现访问页面报500的问题。

分析原因:可能是thymeleaf模板引擎解析找不到模板路径导致的问题。

例如controller层返回url中出现有大写,文件名config.html,路径写成了device/Config,在window下启动项目时可能可以正常访问页面,但是在Linux系统时必须与文件名一致,还有就是前面不要加/,否则也会报500的问题。

12. Java 项目第一次登录页面加载很慢问题?

Java中UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源。在Linux系统下,它的默认依赖是/dev/random,而这个源是阻塞的。

主要原因是nextBytes方法是一个被synchronized关键字修饰的方法,也就是说如果多线程调用UUID,生成速率不升反降,解决这个问题需要修改java的默认随机生成规则就可以。

打开$JAVA_PATH/jre/lib/security/java.security文件,找到下面的内容:

securerandom.source=file:/dev/random

替换成

securerandom.source=file:/dev/./urandom

13. form 表单嵌套如何解决表单提交问题?

表单嵌套通常指的是在一个表单内部嵌套另一个表单。在HTML中,这通常是通过将一个

元素放在另一个元素内部来实现的。然而,这种做法是不推荐的,因为这可能会导致预料之外的行为,尤其是在提交表单时。

当你在一个表单内部嵌套另一个表单时,浏览器可能会对这种情况产生混淆,不知道应该提交哪一个表单。此外,一些浏览器可能会阻止这种嵌套表单的提交,以防止可能的错误或安全问题。

如果你需要在表单内部包含类似表单的元素(例如输入字段),但又不希望它们成为完整的表单,你可以使用

元素。
元素允许你对一组相关的输入字段进行分组,但它并不表示一个完整的表单。

如果你确实需要在一个表单内部嵌套另一个表单,并希望解决提交问题,你可能需要手动处理提交逻辑。这意味着你需要使用JavaScript来监听用户的输入和点击事件,然后手动提交你想要的表单。

下面是一个简单的示例,展示了如何使用JavaScript来处理嵌套表单的提交:

  
    
    
    
      
      
    
  
  

14. Dubbo 中抛出 RpcException:No provider available for remote service 异常如何处理?

1)检查连接的注册中心是否正确。

2)到注册中心查看相应的服务提供者是否存在。

3)检查服务提供者是否正常运行。

15. SQL 语句执行时间过长,如何优化?

1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)。

2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合。

3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度。

4、针对数量大的表进行历史表分离(如交易流水表)。

5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步。

6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等。

7、查看mysql执行日志,看看是否有其他方面的问题。

16. Linux 中如何解决 too many open files 异常问题?

在 Linux 中,如果你遇到了 "too many open files" 异常,这通常意味着你的应用程序或系统已经达到了其打开文件的上限。为了解决这个问题,你可以采取以下几种方法:

  1. 增加系统的文件描述符限制:

    • 查看当前的文件描述符限制:ulimit -n
    • 临时增加限制(例如,设置为 4096):ulimit -n 4096
    • 永久增加限制,编辑 /etc/security/limits.conf 文件,并添加或修改以下行  
`* soft nofile 4096  
* hard nofile 8192`  
```上面的设置将用户进程的文件描述符上限设置为 4096 (soft) 和 8192 (hard)。
  1. 检查并优化应用程序:

    • 确保应用程序没有打开不必要的文件。
    • 如果可能,关闭应用程序中不需要长时间保持打开的文件描述符。
    • 使用诸如 lsof 或 strace 的工具来检查应用程序何时以及如何打开文件。
  2. 使用文件描述符重定向:

    • 如果你的应用程序使用标准输入/输出,并且你可以控制其行为,你可以考虑重定向它们以减少打开的文件描述符的数量。例如,使用 ncat 而不是 nc 可以减少打开的文件描述符数量。
  3. 监控和日志:

    • 使用诸如 inotifyauditd 或其他监控工具来跟踪系统上哪些进程打开了哪些文件,并定期检查和审计日志文件。
  4. 调整系统参数:

    • 考虑调整 /etc/sysctl.conf 中的参数,例如 fs.file-max,以增加系统级别的文件描述符限制。
  5. 使用连接池或复用:

    • 对于数据库连接、网络连接等,考虑使用连接池或复用技术,以减少每个进程打开的连接数。
  6. 检查第三方软件和服务:

  • 如果你的系统上运行有其他软件或服务,确保它们没有达到其打开文件的限制,并考虑调整这些服务的配置。
  1. 升级系统:
  • 在某些情况下,系统的老版本可能存在已知的限制或问题。考虑升级到最新的稳定版本。
  1. 硬件和存储:
  • 在某些情况下,磁盘空间不足或存储问题也可能导致类似错误。确保系统有足够的磁盘空间和正确的存储配置。
  1. 其他软件问题:
  • 有时候,其他软件或配置问题也可能导致此错误。考虑查看相关的日志文件或搜索与你的具体情况相关的已知问题。
  1. 定期审计:
  • 对于生产环境,考虑定期进行系统审计和监控,以确保没有潜在的资源耗尽问题。
  1. 查看文档和社区支持:
  • 对于特定的应用程序或服务,查看其官方文档或社区论坛,看是否有其他用户报告了类似的问题和解决方案。
  1. 考虑负载均衡和集群:
  • 如果是一个高流量的服务器或应用程序,考虑使用负载均衡或集群来分散请求和处理,从而减少单个节点的资源压力。
  1. 代码审查和优化:
  • 在某些情况下,代码中的资源管理问题可能导致此错误。考虑进行代码审查和优化以减少资源使用。
  1. 安全考虑:
  • 在调整任何系统参数之前,确保了解其潜在的安全影响,并采取适当的安全措施。
  1. 使用专业的监控工具:
  • 如 Prometheus, Grafana, New Relic, Datadog 等可以提供关于资源使用和性能的深入见解,帮助你识别和解决这类问题。

17. 如何解决 Redis key/value 中 \xac\xed\x00\x05t\x00 字符串?

如果你在 Redis 中存储了这样的序列化数据,并且你希望将其转换或删除,你需要首先确定你的具体需求。以下是一些可能的步骤:

  1. 确定数据来源:首先,你需要确定这些序列化的数据是从哪里来的。它们是来自于某个应用错误地存储了序列化的对象,还是你故意为之?

  2. 删除或转换数据

    • 删除:如果你确定这些数据不再需要,你可以使用 Redis 的命令直接删除它们。例如,使用 DEL 命令。
    • 转换:如果你想将这些序列化的对象转换为其原始形式或另一种形式,你需要反序列化这些数据。但首先,你需要知道对象的类定义,因为只有类定义和序列化数据匹配时,反序列化才能成功。
  3. 反序列化

    • 使用 Java,你可以使用 ObjectInputStream 来反序列化这些数据。例如:
java`byte[] bytes = ...; // 从 Redis 获取的序列化数据  
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));  
Object obj = ois.readObject();`
  1. 预防措施:为了避免未来再次出现这样的问题,确保你的应用在存储数据到 Redis 之前进行了适当的验证和清理。

  2. 与团队沟通:如果你不是唯一一个负责这个 Redis 实例的人,确保与你的团队成员沟通你的操作和目的,以确保没有意外的副作用。

18. MySQL 中 如何解决 Incorrect string value: '\xE5\xB0' 异常?

MySQL 中出现 "Incorrect string value: '\xE5\xB0'" 异常通常是因为尝试将一个包含特殊字符的字符串插入到字符集不支持该字符集的列中。

要解决这个问题,你可以采取以下步骤:

  1. 检查列的字符集:
    首先,检查出问题的列的字符集设置。你可以使用以下命令查看表的创建语句:

SHOW CREATE TABLE your_table_name;

 在返回的结果中,查找列的字符集定义,例如 CHARACTER SET utf8mb4
2. 确保数据和列字符集匹配:
如果你的数据包含特殊或非标准字符,确保列的字符集支持这些字符。例如,使用 utf8mb4 字符集可以支持大部分 Unicode 字符。
3. 转换数据字符集:
如果你不能更改列的字符集,或者不想更改,你可以尝试将数据转换为列所支持的字符集。例如,使用 CONVERT() 函数:

UPDATE your_table_name SET your_column_name = CONVERT(your_column_name USING utf8mb4);

注意:在执行此操作之前,请确保备份你的数据,以防万一出现问题。
4. 更改列的字符集:
如果可能,更改列的字符集以支持你的数据。使用以下命令更改列的字符集:

ALTER TABLE your_table_name MODIFY your_column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

这将更改列的字符集为 utf8mb4,并使用 utf8mb4_unicode_ci 排序规则。
5. 检查数据库和连接的字符集设置:
确保数据库和连接的字符集设置也是 utf8mb4。你可以在连接 MySQL 时设置 character_set_clientcharacter_set_connection, 和 character_set_results 变量,或者在 MySQL 配置文件中设置这些变量。
6. 检查连接编码:
如果你使用的是编程语言(如 PHP、Python 等)与 MySQL 交互,确保连接编码设置为 utf8mb4。例如,在 PHP 中,你可以这样设置:

$conn = new mysqli($servername, $username, $password, $dbname);  
$conn->set_charset('utf8mb4');
  1. 避免非标准字符:
    如果可能的话,尽量避免在数据库中存储非标准或特殊字符。始终确保输入的数据是有效的 Unicode 字符串。
  2. 使用正确的客户端工具:
    如果你使用的是命令行客户端,确保你使用的客户端版本支持 utf8mb4 字符集。较旧的客户端可能不支持这个字符集。
  3. 检查其他设置和约束:
    检查是否有其他设置或约束(如外键约束、唯一约束等)导致插入操作失败。如果有,根据具体情况进行调整。
  4. 日志和错误信息:
    查看 MySQL 的错误日志和应用程序的日志,以获取更多关于错误的详细信息。这可能会提供关于为什么出现这个错误的有用线索。
  5. 测试和验证:
    在尝试任何更改之前和之后,确保备份你的数据。进行小规模更改并测试,以确保没有意外的影响。
  6. 考虑使用其他工具或库:
    如果你频繁遇到这个问题,并且数据量很大,考虑使用其他工具或库来转换或处理数据。有些工具和库可能提供更好的支持或更简单的解决方案。
  7. 检查其他相关设置和表:
    确保其他相关的表和数据库设置也支持 utf8mb4 字符集。例如,检查数据库、表和列级别的字符集设置。
  8. 考虑外部因素:
    如果问题仍然存在,考虑外部因素,如操作系统、文件系统或网络设置等,它们可能影响数据的正确处理。

19. Tomcat 启动 Spring 项目如何实现注解方式配置定时任务?

Spring项目非Spring Boot项目借助Tomcat启动war包来启动项目,通过注解的方式配置定时任务。

1、在spring-mvc.xml的配置文件中添加约束文件:

xmlns:task="http://www.springframework.org/schema/task" 
http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.2.xsd 

2、配置注解驱动

3、添加注解的扫描包

4、定时任务代码

package com.jingxuan;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class JingxuanTask {
    @Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
    public void task() {
        System.out.println("----定时任务开始执行-----");
		//执行具体业务逻辑----------  
        System.out.println("----定时任务执行结束-----");
    }
}

20. Tomcat 可以多个同时启动吗?如何实现?

Tomcat可以多个同时启动,但需要修改server.xml配置文件的端口号。

修改%TOMCAT_HOME%\conf下的server.xml配置文件

第一个: 修改http访问端口(默认为8080端口)

将8080修改为第一个tomcat不在使用的端口号。此处所设的端口号即是访问web时所用的端口号。

第二个: 修改Shutdown端口(默认为8005端口)

将8005修改为没有在使用的端口号。

第三个: 修改8009端口

将8009修改为没有在使用的端口号。

你可能感兴趣的:(bug,面试)