1. OutOfMemoryError(内存溢出)
问题描述:JVM无法分配更多内存时抛出,日志中常见“java.lang.OutOfMemoryError: Java heap space”(堆内存不足)或“java.lang.OutOfMemoryError: Metaspace”(元空间不足)。
可能原因:JVM堆内存设置过小(如-Xmx参数值不足);应用程序存在内存泄漏(如未关闭的数据库连接、集合对象无限增长);元空间加载的类过多(如动态生成类)。
解决方法:
-Xms(初始堆大小)和-Xmx(最大堆大小)增加堆内存(如-Xms512m -Xmx2048m);若元空间溢出,调整-XX:MetaspaceSize和-XX:MaxMetaspaceSize(如-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m)。-XX:+HeapDumpOnOutOfMemoryError参数生成),重点检查大对象、集合类或未关闭的资源。2. NullPointerException(空指针异常)
问题描述:试图访问未初始化对象的属性或方法,日志中常见“java.lang.NullPointerException”及具体代码位置(如at com.example.MyClass.myMethod(MyClass.java:20))。
可能原因:对象未正确初始化(如String str = null;后直接调用str.length());输入参数为空(如方法接收的外部参数未校验);数据库查询返回空结果但未处理。
解决方法:
if (str != null) { System.out.println(str.length()); }。3. ClassNotFoundException(类未找到异常)
问题描述:试图加载类但未找到对应的类文件,日志中常见“java.lang.ClassNotFoundException: com.example.MyClass”。
可能原因:类路径(CLASSPATH)配置错误(如JAR包未放入类路径);依赖缺失(如Maven/Gradle项目中未引入所需依赖);类文件被误删除。
解决方法:
echo $CLASSPATH查看环境变量,或Tomcat的lib目录是否有依赖JAR)。pom.xml是否包含所需依赖(如<dependency>["是", "com.example:my-library:1.0.0"]</dependency>),并执行mvn install下载依赖。4. NoClassDefFoundError(类定义未找到错误)
问题描述:类在编译时存在,但运行时无法找到,日志中常见“java.lang.NoClassDefFoundError: com/example/MyClass”(可能伴随“Caused by: java.lang.ClassNotFoundException”)。
可能原因:编译后的类文件未打包到运行环境中(如WAR/JAR文件缺失类);依赖库版本冲突(如不同版本的同一类库冲突);类加载器问题(如Tomcat的共享库与Web应用库冲突)。
解决方法:
WEB-INF/classes目录)或依赖JAR(如WEB-INF/lib目录)已正确打包到运行包中。mvn dependency:tree查看依赖树,排除重复或冲突的依赖(如<exclusions>标签排除冲突的传递依赖)。5. IllegalArgumentException(非法参数异常)
问题描述:传递给方法的参数不合法,日志中常见“java.lang.IllegalArgumentException: Invalid argument value”及参数详情。
可能原因:参数值为null(如方法要求非空但传入null);参数类型不符合要求(如方法要求int但传入String);参数范围超出限制(如数组索引为负数)。
解决方法:
if (param == null) { throw new IllegalArgumentException("Param cannot be null"); })。6. StackOverflowError(栈溢出错误)
问题描述:方法调用层次过深导致栈空间耗尽,日志中常见“java.lang.StackOverflowError”。
可能原因:无限递归调用(如递归方法未设置终止条件);方法调用链过长(如A调用B调用C…循环调用)。
解决方法:
if (n <= 0) return;),或改用循环替代递归(如用for循环计算阶乘)。-Xss参数增大线程栈大小(如-Xss2m,默认通常为1MB),但需谨慎使用(可能掩盖代码问题)。7. 日志文件路径/权限问题
问题描述:应用程序无法写入日志文件,日志中常见“java.io.FileNotFoundException: /path/to/logfile.log (Permission denied)”或“日志文件未生成”。
可能原因:日志文件路径不存在(如/var/log/myapp目录未创建);应用程序无写入权限(如日志目录属主为root,而应用以普通用户运行);日志配置错误(如Log4j/Logback配置文件中路径拼写错误)。
解决方法:
ls -ld /path/to/logdir确认目录是否存在,若不存在则创建(mkdir -p /path/to/logdir)。chmod命令赋予应用用户写入权限(如chown -R appuser:appgroup /var/log/myapp,chmod -R 755 /var/log/myapp)。log4j.properties)或Logback(logback.xml)中的FileAppender配置,确保路径拼写正确(如<file>/var/log/myapp/app.log</file>)。8. 日志轮转与备份问题
问题描述:日志文件过大占用磁盘空间,或旧日志未备份导致数据丢失,日志中常见“日志文件已达最大大小”或“无法创建新日志文件”。
可能原因:未配置日志轮转(如Log4j/Logback未开启RollingFileAppender);轮转策略不合理(如按天轮转但日志量太大);备份目录不可写。
解决方法:
<rollingPolicy>),例如Logrotate配置文件(/etc/logrotate.d/myapp)示例:/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
或Logback的滚动策略:<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
compress)减少磁盘占用。