当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot WebFlux Starter时出现java.lang.OutOfMemoryError

傅和璧
2023-03-14

我已经创建了 2 个微服务,其中包含 Spring Boot(版本 1.5.1 RELEASE)、Spring Cloud(Edgware.SR3)、Spring Cloud Starter Config(版本 1.4.3 RELEASE)和 Netflix 的 Eureka 命名服务器(Spring Cloud Starter Netflix Eureka Client/Server 1.4.4 RELEASE):

    < Li > Eureka服务器(用于注册微服务的服务) < Li > Eureka客户端(用于保存/更新操作的数据库服务)

Eureka 客户端是一个简单的 Restful 服务,具有单个@PostMapping注释方法,该方法接受相当大的对象作为参数(@RequestBody MyObject 对象)。

Eureka客户端向Eureka服务器成功注册。

然后,在Spring Boot Webflux的帮助下,我尝试在Spring 5中引入的类< code>WebClient的帮助下访问我的Eureka客户端,它是在< code>AsyncRestTemplate类上即兴创作的。我做了如下的事情:

WebClient webClient = WebClient.create();
reactor.core.publisher.Mono result = (Mono) webClient.post()
.uri("http://localhost:8080/eureka-client")
.body(BodyInserters.fromObject(//myComplexObject here))
.retrieve()
.bodyToMono(String.class);

result.subscribe();

调试中,我发现我在上面代码的最后一行之后得到了OOM异常。

io.netty.handler.codec.EncoderException: java.lang.OutOfMemoryError

下面是完整的堆栈跟踪:

[reactor-http-nio-4] WARN  io.netty.util.concurrent.AbstractEventExecutor  - A task raised an exception. Task: reactor.ipc.netty.channel.ContextHandler$$Lambda$401/11401686@10ae5a2

reactor.core.Exceptions$ErrorCallbackNotImplemented: io.netty.handler.codec.EncoderException: java.lang.OutOfMemoryError

Caused by: io.netty.handler.codec.EncoderException: java.lang.OutOfMemoryError

                at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:106)

                at io.netty.channel.CombinedChannelDuplexHandler.write(CombinedChannelDuplexHandler.java:348)

                at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738)

                at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730)

                at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:816)

                at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723)

                at reactor.ipc.netty.channel.ChannelOperationsHandler.doWrite(ChannelOperationsHandler.java:291)

                at reactor.ipc.netty.channel.ChannelOperationsHandler.drain(ChannelOperationsHandler.java:465)

                at reactor.ipc.netty.channel.ChannelOperationsHandler.flush(ChannelOperationsHandler.java:191)

                at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)

                at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802)

                at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)

                at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)

                at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)

                at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1051)

                at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:300)

                at reactor.ipc.netty.http.HttpOperations.lambda$then$0(HttpOperations.java:135)

                at reactor.ipc.netty.FutureMono.lambda$deferFuture$0(FutureMono.java:68)

                at reactor.ipc.netty.FutureMono$DeferredFutureMono.subscribe(FutureMono.java:134)

                at reactor.core.publisher.Mono.subscribe(Mono.java:3008)

                at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:167)

                at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)

                at reactor.core.publisher.Mono.subscribe(Mono.java:3008)

                at reactor.core.publisher.FluxConcatIterable$ConcatIterableSubscriber.onComplete(FluxConcatIterable.java:141)

                at reactor.core.publisher.FluxConcatIterable.subscribe(FluxConcatIterable.java:60)

                at reactor.core.publisher.MonoSourceFlux.subscribe(MonoSourceFlux.java:47)

                at reactor.ipc.netty.channel.ChannelOperations.applyHandler(ChannelOperations.java:380)

                at reactor.ipc.netty.http.client.HttpClientOperations.onHandlerStart(HttpClientOperations.java:501)

                at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)

                at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)

                at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)

                at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)

                at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.OutOfMemoryError

                at sun.misc.Unsafe.allocateMemory(Native Method)

                at io.netty.util.internal.PlatformDependent0.allocateDirectNoCleaner(PlatformDependent0.java:430)

                at io.netty.util.internal.PlatformDependent.allocateDirectNoCleaner(PlatformDependent.java:596)

                at io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:764)

                at io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:740)

                at io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:244)

                at io.netty.buffer.PoolArena.allocate(PoolArena.java:214)

                at io.netty.buffer.PoolArena.allocate(PoolArena.java:146)

                at io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:324)

                at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:185)

                at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:176)

                at io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:113)

                at io.netty.handler.codec.http.HttpObjectEncoder.encode(HttpObjectEncoder.java:92)

                at io.netty.handler.codec.http.HttpClientCodec$Encoder.encode(HttpClientCodec.java:167)

                at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:88)

                ... 32 more

我的类路径中有杰克逊库,并依靠 spring 来序列化我的复杂对象,同时将其传递给 Restful 服务。我不确定是什么原因造成的。请指点什么?

共有1个答案

姚棋
2023-03-14

将其添加到java执行路径中

-Dio.netty.noPreferDirect=真

 类似资料:
  • 问题内容: 我正在尝试从中删除一些元素,但即使是最简单的示例,如本答案或本示例中的示例,也将无法使用。 使用法线代替a 并没有帮助。我想念什么?我正在使用Java 7。 问题答案: 返回由原始数组支持的列表。您对列表所做的更改也将反映在您传入的数组中。由于您无法向数组添加或删除元素,因此对列表进行这种创建也是不可能的,这就是调用失败的原因。如果要能够动态添加和删除元素,则需要使用(,等)的不同实现

  • 问题内容: 我的python列表中有以下字符串(来自命令提示符): 进一步将默认编码也更改为utf-16。但是仍然抛出异常如下: 无法确定此类字符串需要哪种转换才能正常工作。 问题答案: 无法使用utf-8,utf-16编码进行解码。 尝试latin-1编码: 或者,指定,以使其不尝试解码字符串。

  • 问题内容: 我有一个像这样的numpy数组: 我想将数组中的数字四舍五入到小数点后两位或三位。我尝试使用numpy.around和numpy.round,但是它们都给我以下错误: 我曾经 和 难道我做错了什么?还有其他方法可以有效地对大型阵列执行此操作吗? 问题答案: 您不能对作为对象的numpy数组进行四舍五入,只要可以将数组安全地转换为float即可更改此值: 对于字符串,unicode,vo

  • 问题内容: 那我在做什么错呢? 但是,我只会 问题答案: 您正在使用而不是python 2,它将输入评估为python代码。 相当于 输入 raw_input 另外,您正在尝试将“烧杯”转换为整数,这没有多大意义。 您可以这样替换您脑海中的输入: 和:

  • 我使用 我编写了一些以块结尾的jruby代码,在运行所有代码后,出现了NullPointerException。但代码以任何其他语句结尾,不会发生异常。 版本:1.7.19 在ARGV。java vars.get变量返回null,因为在BiVariableM中isReceiverIdentical返回falseap.java 在ISReceiver中,此方法只需将接收器与双变量的接收器usgin'

  • 我试图使用JavaCV从我的webcamera.but捕获快照,当我运行下面的代码时,我得到了一个执行。它说找不到com/googlecode/javacpp/Pointer类。我能做些什么来解决这个错误... 例外

  • 下面的电话(我将敏感信息替换为 产生以下错误: Flyway输出:Boxfuse的Flyway 4.2.0 异常在线程"main"java.lang.NoClassDefFoundError: oracle/dms/控制台/DMS控制台在oracle.jdbc.driver.DMSFactory。(DMSFactory.java:44)在oracle.jdbc.driver.物理onnection

  • 问题内容: 我试图学习反思,并且遇到了这个IllegalAccessException。请参见以下代码: 当我尝试运行该程序时,得到以下信息: 我不明白发生了什么。有任何想法吗?提前致谢。 问题答案: 您需要禁止Java语言访问检查,以便使用setAccessible(true)反射地调用另一个类中的私有方法: 此外,启用SecurityManager后,我们需要额外的权限才能调用setAcces