JVM1

本文详细介绍了Java虚拟机(JVM)内存布局,包括计数器、虚拟机栈、本地方法栈、Java堆、方法区及运行时常量池等功能区域的作用与特点。探讨了对象创建过程与内存分配策略,并分析了各种内存溢出错误产生的原因。

Java虚拟机内存区分布概要

计数器(program counter register)

  • 计数器是内存中分配的较小的内存空间,可以看成当前线程执行字节码的型号指示器,字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令。(分支,循环,跳转,异常处理,线程回复等)
  • java多线程,是通过线程切换与分配处理时间方式实现,为了线程切换后能回复到正确执行位置,需要一个独立的计数器,各线程之间计数器互不影响,计数器内存区域也被称为“线程私有”内存
  • 一个线程在执行java方法,计数器记录的是正在执行的虚拟机字节码指令地址。计数器内存区域是唯一没有OOM情况的区域

虚拟机栈与本地方法栈

  • 虚拟机栈是描述java方法执行的内存模型。一个方法执行的时候,会创建一个栈帧,栈帧是用来存储局部变量表,操作数栈,动态链接,方法出口(方法执行结束返回标识该方法执行地址的标记)。
  • 局部变量表存放了各种基本类型,所需要的内存空间是在编译期间就完成分配,并且大小是固定的,方法运行的时候,不会改变局部变量表的大小。
  • 虚拟机栈异常:请求深度大于虚拟机允许抛出stackverflowError ,如果动态扩展申请不到足够的内存抛出OOM 。其实两种情况实际都是一件事, 实际应用过程中,栈内存溢出都只会抛出前一个异常。
  • 线程私有的,生命周期与线程相同

Java堆(GC主要管理区域)

  • 此内存区,唯一目的就是存储java对象实例
  • 该内存区是垃圾收集的主要区域,按照收集器分代收集算法,该区域可以细分为新生代,老年代。新生代又细分为Eden,from survivor,to survivor。默认比例为8:1:1
  • 假设对象在Eden,from中产生。如果GC一次之后,该对象还存活,则将该对象移入to中。以后每次GC,如果存活则age +1.默认age=15则移入老年代。
  • 大对象应该是直接存储在老年代中的。
  • -Xms -Xmx设定最小内存与最大内存空间,如果没有足够空间完成实例分配,抛出oom异常。两个参数一般设置为一致,以避免每次垃圾回收完成后JVM重新分配内存。
  • 该内存区是线程共享的

方法区与运行时常量池

  • 方法区主要存储已经被虚拟机加载的类的信息,常量,静态变量,即时编译器编译后的代码。在java虚拟机规范中把方法区描述为堆的逻辑部分,有一个别名叫Non-Heap 与java堆做区分。
  • 运行时常量池是方法区一部分,运行时常量池区分常量池是具备了动态性,运行期间,也可以设置常量,String intern()方法,如果常量表中没有该记录,则添加记录,并且返回引用地址,如果已经存在,则返回存在的引用地址。
  • 无法满足内存分配抛出oom异常
  • 该区是线程共享的

直接内存

  • 直接内存不是虚拟机运行时数据区一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存也被频繁调用,同样可能出现oom异常,nio可以直接使用native函数库直接分配堆外内存,通过java堆中的DirectByteBuffer对象作为这一块内存的应用进行操作,避免了java堆与native堆中来回复制数据。
  • 设置-Xmx等参数的时候,总和要小于物理内存,不然堆外内存空间不足,造成oom。

对象的创建过程(初解)

  • 对象创建所需要的内存的大小在类加载完成后就可以确定,虚拟机给对象分配内存有两种方式:指针碰撞与空闲列表。
  • 虚拟机创建对象过程需要在虚拟机中分配空间,因此创建对象过程不是线程安全的,解决方法有两种:CAS+失败重试;本地线程分配缓冲(TLAB:预先给每一个线程分配一小块内存)

对象内存布局

  • 对象在内存中分为三部分:对象头(header),实例数据(Instance Data),对其填充(padding)
  • 对象头包含两个部分:(1)自身运行时数据(hashcode(25),age(4),锁状态标示(2)等);(2)类型指针,确定该对象是属于哪一个类的实例
  • 实例数据部分是对象真正存储的有效信息,也就是在代码中定义的各种类型的字段的内容。存储顺序是收到虚拟机分配策略影响的。
  • 填充区没有任何意义,只是保证对象大小是8的倍数。

对象访问定位

  • java程序需要操作栈上的reference数据操作堆上的具体对象,目前主流的访问方式有:句柄访问,直接指针
  • 句柄访问,java堆中有一块内存叫做句柄池,存放了对象的句柄地址,包含对象的实例数据指针与对象类型指针。
  • 直接指针,java堆在对象创建过程中,包含了对象类型信息。reference直接存储对象实例地址,这样访问速度更快。hotspot使用的是直接指针方式

OutOfMemoryError异常

  • java堆溢出(-Xms,-Xmx):只要不断创建对象,为了方式对象被回收,将对象存入list中即可抛出oom异常。可以配置-XX:HeapDumpOnOutOfMemoryError虚拟机参数,Dump出当前的内存堆转储快照,便于事后分析。MAT工具(memory analyzer)可以对dump出的文件做分析
  • 虚拟机栈和本地方法栈溢出(-Xss):(1)将局部变量不停增加,超出栈内存(2)大量创建线程。如果栈内存不够,这两种方法都是抛出StackOverflowError。
  • 方法区和运行时常量池溢出(-XX:PermSize -XX:MaxPermSize):List.add(String.value(i++).intern())。方法区存放的是类名,修饰符,常量,字段描述,方法描述等信息,内存溢出的思路是运行时产生大量的类去填充方法区
  • 直接内存溢出(-XX:MaxDirectMemorySize=10M):如果不设置等同于-Xmx.
STATUS | wrapper | 2025/07/03 18:04:47 | --> Wrapper Started as Service STATUS | wrapper | 2025/07/03 18:04:47 | Java Service Wrapper Community Edition 32-bit 3.5.40 STATUS | wrapper | 2025/07/03 18:04:47 | Copyright (C) 1999-2019 Tanuki Software, Ltd. All Rights Reserved. STATUS | wrapper | 2025/07/03 18:04:47 | http://wrapper.tanukisoftware.com STATUS | wrapper | 2025/07/03 18:04:47 | STATUS | wrapper | 2025/07/03 18:04:47 | Launching a JVM... INFO | jvm 1 | 2025/07/03 18:04:47 | WrapperManager: Initializing... INFO | jvm 1 | 2025/07/03 18:04:48 | Spring Boot Version: 2.3.5.RELEASE INFO | jvm 1 | 2025/07/03 18:04:48 | Spring Application Name: ${spring.application.name} INFO | jvm 1 | 2025/07/03 18:04:48 | INFO | jvm 1 | 2025/07/03 18:04:48 | INFO | jvm 1 | 2025/07/03 18:04:48 | 2025-07-03 18:04:48.626 [INFO background-preinit Version.java,21] - HV000001: Hibernate Validator 6.1.6.Final INFO | jvm 1 | 2025/07/03 18:04:48 | 2025-07-03 18:04:48.660 [INFO WrapperSimpleAppMain StartupInfoLogger.java,55] - Starting SystemApplication v2.0.1 on WIN-SP8HDN9UCIT with PID 19988 (D:\local_admin_feature\Application\local_admin_feature\custody-backend.jar started by WIN-SP8HDN9UCIT$ in D:\local_admin_feature\Application\local_admin_feature) INFO | jvm 1 | 2025/07/03 18:04:48 | 2025-07-03 18:04:48.660 [INFO WrapperSimpleAppMain SpringApplication.java,655] - The following profiles are active: test INFO | jvm 1 | 2025/07/03 18:04:50 | 2025-07-03 18:04:50.751 [INFO WrapperSimpleAppMain DirectJDKLog.java,173] - Initializing ProtocolHandler ["http-nio-8089"] INFO | jvm 1 | 2025/07/03 18:04:50 | 2025-07-03 18:04:50.752 [INFO WrapperSimpleAppMain DirectJDKLog.java,173] - Starting service [Tomcat] INFO | jvm 1 | 2025/07/03 18:04:50 | 2025-07-03 18:04:50.752 [INFO WrapperSimpleAppMain DirectJDKLog.java,173] - Starting Servlet engine: [Apache Tomcat/9.0.39] INFO | jvm 1 | 2025/07/03 18:04:50 | 2025-07-03 18:04:50.806 [INFO WrapperSimpleAppMain DirectJDKLog.java,173] - Initializing Spring embedded WebApplicationContext INFO | jvm 1 | 2025/07/03 18:04:50 | Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. INFO | jvm 1 | 2025/07/03 18:04:51 | 2025-07-03 18:04:50.969 [INFO WrapperSimpleAppMain MybatisPlusConfig.java,16] - =====MybatisPlusInterceptor======= INFO | jvm 1 | 2025/07/03 18:04:51 | 2025-07-03 18:04:51.107 [INFO WrapperSimpleAppMain DruidDataSource.java,994] - {dataSource-1,master} inited INFO | jvm 1 | 2025/07/03 18:04:51 | 2025-07-03 18:04:51.108 [INFO WrapperSimpleAppMain DynamicRoutingDataSource.java,148] - dynamic-datasource - add a datasource named [master] success INFO | jvm 1 | 2025/07/03 18:04:51 | 2025-07-03 18:04:51.108 [INFO WrapperSimpleAppMain DynamicRoutingDataSource.java,228] - dynamic-datasource initial loaded [1] datasource,primary datasource named [master] INFO | jvm 1 | 2025/07/03 18:04:51 | Registered plugin: 'com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor@a87fb' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/addrbook/xml/AddressBookMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/commandlog/xml/CommandLogMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/config/xml/ConfigMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/dict/xml/DictionaryMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/uppack/xml/UpgradePackMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/OperateLogMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/RoleAssPermissionMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/RoleMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/TsDemoMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/UserMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | Parsed mapper file: 'URL [jar:file:/D:/local_admin_feature/Application/local_admin_feature/custody-backend.jar!/BOOT-INF/lib/common-datasource-2.0.1.jar!/com/iot/common/datasource/mapper/xml/UserRoleMapper.xml]' INFO | jvm 1 | 2025/07/03 18:04:51 | org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@2aaa27 INFO | jvm 1 | 2025/07/03 18:04:51 | _ _ |_ _ _|_. ___ _ | _ INFO | jvm 1 | 2025/07/03 18:04:51 | | | |\/|_)(_| | |_\ |_)||_|_\ INFO | jvm 1 | 2025/07/03 18:04:51 | / | INFO | jvm 1 | 2025/07/03 18:04:51 | 3.5.0 INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.044 [INFO WrapperSimpleAppMain StdSchedulerFactory.java,1220] - Using default implementation for ThreadExecutor INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.060 [INFO WrapperSimpleAppMain SchedulerSignalerImpl.java,61] - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.060 [INFO WrapperSimpleAppMain QuartzScheduler.java,229] - Quartz Scheduler v.2.3.2 created. INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.061 [INFO WrapperSimpleAppMain RAMJobStore.java,155] - RAMJobStore initialized. INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.062 [INFO WrapperSimpleAppMain QuartzScheduler.java,294] - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' INFO | jvm 1 | 2025/07/03 18:04:52 | Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. INFO | jvm 1 | 2025/07/03 18:04:52 | NOT STARTED. INFO | jvm 1 | 2025/07/03 18:04:52 | Currently in standby mode. INFO | jvm 1 | 2025/07/03 18:04:52 | Number of jobs executed: 0 INFO | jvm 1 | 2025/07/03 18:04:52 | Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. INFO | jvm 1 | 2025/07/03 18:04:52 | Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. INFO | jvm 1 | 2025/07/03 18:04:52 | INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.062 [INFO WrapperSimpleAppMain StdSchedulerFactory.java,1374] - Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.062 [INFO WrapperSimpleAppMain StdSchedulerFactory.java,1378] - Quartz scheduler version: 2.3.2 INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.062 [INFO WrapperSimpleAppMain QuartzScheduler.java,2293] - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@1f66f1d INFO | jvm 1 | 2025/07/03 18:04:52 | 2025-07-03 18:04:52.092 [INFO WrapperSimpleAppMain JobConfig.java,30] - --------开启定时任务--------- INFO | jvm 1 | 2025/07/03 18:04:52 | Creating a new SqlSession INFO | jvm 1 | 2025/07/03 18:04:52 | SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f75596] was not registered for synchronization because synchronization is not active INFO | jvm 1 | 2025/07/03 18:05:13 | 2025-07-03 18:05:13.253 [ERROR Druid-ConnectionPool-Create-28239769 DruidDataSource.java,2781] - create connection SQLException, url: jdbc:mysql://192.168.200.60:3306/custody_backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8, errorCode 0, state 08S01 INFO | jvm 1 | 2025/07/03 18:05:13 | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:13 | INFO | jvm 1 | 2025/07/03 18:05:13 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2779) INFO | jvm 1 | 2025/07/03 18:05:13 | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:13 | INFO | jvm 1 | 2025/07/03 18:05:13 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:13 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:13 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) INFO | jvm 1 | 2025/07/03 18:05:13 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.NativeSession.connect(NativeSession.java:144) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) INFO | jvm 1 | 2025/07/03 18:05:13 | ... 9 common frames omitted INFO | jvm 1 | 2025/07/03 18:05:13 | Caused by: java.net.ConnectException: Connection timed out: connect INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.DualStackPlainSocketImpl.connect0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) INFO | jvm 1 | 2025/07/03 18:05:13 | at java.net.Socket.connect(Socket.java:589) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) INFO | jvm 1 | 2025/07/03 18:05:13 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) INFO | jvm 1 | 2025/07/03 18:05:13 | ... 12 common frames omitted INFO | jvm 1 | 2025/07/03 18:05:34 | 2025-07-03 18:05:34.295 [ERROR Druid-ConnectionPool-Create-28239769 DruidDataSource.java,2781] - create connection SQLException, url: jdbc:mysql://192.168.200.60:3306/custody_backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8, errorCode 0, state 08S01 INFO | jvm 1 | 2025/07/03 18:05:34 | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:34 | INFO | jvm 1 | 2025/07/03 18:05:34 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2779) INFO | jvm 1 | 2025/07/03 18:05:34 | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:34 | INFO | jvm 1 | 2025/07/03 18:05:34 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:34 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:34 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) INFO | jvm 1 | 2025/07/03 18:05:34 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.NativeSession.connect(NativeSession.java:144) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) INFO | jvm 1 | 2025/07/03 18:05:34 | ... 9 common frames omitted INFO | jvm 1 | 2025/07/03 18:05:34 | Caused by: java.net.ConnectException: Connection timed out: connect INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.DualStackPlainSocketImpl.connect0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) INFO | jvm 1 | 2025/07/03 18:05:34 | at java.net.Socket.connect(Socket.java:589) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) INFO | jvm 1 | 2025/07/03 18:05:34 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) INFO | jvm 1 | 2025/07/03 18:05:34 | ... 12 common frames omitted INFO | jvm 1 | 2025/07/03 18:05:34 | 2025-07-03 18:05:34.296 [INFO Druid-ConnectionPool-Create-28239769 DruidAbstractDataSource.java,1791] - {dataSource-1} failContinuous is true INFO | jvm 1 | 2025/07/03 18:05:55 | 2025-07-03 18:05:55.853 [ERROR Druid-ConnectionPool-Create-28239769 DruidDataSource.java,2781] - create connection SQLException, url: jdbc:mysql://192.168.200.60:3306/custody_backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8, errorCode 0, state 08S01 INFO | jvm 1 | 2025/07/03 18:05:55 | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:55 | INFO | jvm 1 | 2025/07/03 18:05:55 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2779) INFO | jvm 1 | 2025/07/03 18:05:55 | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure INFO | jvm 1 | 2025/07/03 18:05:55 | INFO | jvm 1 | 2025/07/03 18:05:55 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. INFO | jvm 1 | 2025/07/03 18:05:55 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:55 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) INFO | jvm 1 | 2025/07/03 18:05:55 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.NativeSession.connect(NativeSession.java:144) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) INFO | jvm 1 | 2025/07/03 18:05:55 | ... 9 common frames omitted INFO | jvm 1 | 2025/07/03 18:05:55 | Caused by: java.net.ConnectException: Connection timed out: connect INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.DualStackPlainSocketImpl.connect0(Native Method) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) INFO | jvm 1 | 2025/07/03 18:05:55 | at java.net.Socket.connect(Socket.java:589) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) INFO | jvm 1 | 2025/07/03 18:05:55 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) INFO | jvm 1 | 2025/07/03 18:05:55 | ... 12 common frames omitted 报错如何解决?
07-04
根据提供的日志信息,应用启动时尝试连接MySQL数据库失败,报错显示为"Communications link failure"(连接超时)。以下是可能的原因和解决方案: ### 原因分析: 1. **数据库服务未运行**:目标MySQL服务器(192.168.200.60:3306)可能未启动 2. **网络连接问题**: - 防火墙阻止了3306端口的连接 - 网络配置错误导致无法访问目标IP 3. **认证问题**:用户名/密码错误(虽然日志未显示认证错误,但需确认) 4. **数据库配置错误**:连接URL中的数据库名称(custody_backend)可能不存在 ### 解决方案: #### 1. 检查数据库服务状态 ```bash # 在MySQL服务器上执行(如果是Linux) systemctl status mysql # 或 service mysql status # Windows检查服务是否运行 ``` #### 2. 验证网络连通性 ```bash # 从应用服务器测试连接 telnet 192.168.200.60 3306 # 或 nc -zv 192.168.200.60 3306 ``` #### 3. 检查防火墙设置 ```bash # Linux检查防火墙规则 iptables -L -n | grep 3306 # 或 firewall-cmd --list-ports # Windows检查防火墙入站规则 ``` #### 4. 验证数据库配置 检查应用的配置文件(如application.properties/yml): ```properties spring.datasource.url=jdbc:mysql://192.168.200.60:3306/custody_backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=your_username spring.datasource.password=your_password ``` #### 5. 临时解决方案(不推荐生产环境) 如果只是测试环境,可以尝试: - 在MySQL配置中添加`skip-networking`(错误,应该是`skip-name-resolve`)或绑定到0.0.0.0 - 临时关闭防火墙测试 #### 6. 检查Druid连接池配置 在配置中添加连接测试和重试机制: ```yaml spring: datasource: druid: initial-size: 5 min-idle: 5 max-active: 20 validation-query: SELECT 1 test-while-idle: true test-on-borrow: true time-between-eviction-runs-millis: 60000 ``` ### 验证步骤: 1. 先确保能从应用服务器ping通数据库服务器: ```bash ping 192.168.200.60 ``` 2. 使用MySQL客户端直接连接测试: ```bash mysql -h 192.168.200.60 -P 3306 -u username -p ``` ### 长期解决方案: 1. 设置数据库连接的健康检查机制 2. 配置连接池的最大等待时间和重试策略 3. 考虑使用连接池的fail-fast模式(如HikariCP的`connection-timeout`)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值