You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Xun Wang (Jira)" <ji...@apache.org> on 2019/08/23 03:48:00 UTC
[jira] [Created] (AVRO-2519) Use NettyTransceiver repeatedly
connect to remote server which doesn't support current RPC or unavailable
will cause " java.lang.OutOfMemoryError: Direct buffer memory"
Xun Wang created AVRO-2519:
------------------------------
Summary: Use NettyTransceiver repeatedly connect to remote server which doesn't support current RPC or unavailable will cause " java.lang.OutOfMemoryError: Direct buffer memory"
Key: AVRO-2519
URL: https://issues.apache.org/jira/browse/AVRO-2519
Project: Apache Avro
Issue Type: Bug
Components: java
Affects Versions: 1.9.0
Environment: java version "12.0.1" 2019-04-16
Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
Reporter: Xun Wang
Attachments: avro-rpc-quickstart test.zip
I just modify the code from https://github.com/phunt/avro-rpc-quickstart。Execute the modified code can 100% reproduce this issue. I have attached the test project file. When use NettyTransceiver repeatedly connect to remote server which doesn't support current RPC or unavailable will cause " java.lang.OutOfMemoryError: Direct buffer memory"
The source to execute:
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import org.apache.avro.ipc.netty.NettyServer;
import org.apache.avro.ipc.netty.NettyTransceiver;
import org.apache.avro.ipc.Server;
import org.apache.avro.ipc.specific.SpecificRequestor;
import org.apache.avro.ipc.specific.SpecificResponder;
import org.apache.avro.util.Utf8;
import example.proto.Mail;
import example.proto.Message;
/**
* Start a server, attach a client, and send a message.
*/
public class Main {
public static class MailImpl implements Mail {
// in this simple example just return details of the message
public Utf8 send(Message message) {
System.out.println("Sending message");
return new Utf8("Sending message to " + message.getTo().toString() + " from " + message.getFrom().toString()
+ " with body " + message.getBody().toString());
}
}
private static Server server;
private static void startServer() throws IOException {
server = new NettyServer(new SpecificResponder(Mail.class, new MailImpl()), new InetSocketAddress(65111));
// the server implements the Mail protocol (MailImpl)
}
public static void main(String[] args) throws IOException {
// if (args.length != 3) {
// System.out.println("Usage: <to> <from> <body>");
// System.exit(1);
// }
System.out.println("Starting server");
// usually this would be another app, but for simplicity
// startServer();
System.out.println("Server started");
while (true) {
NettyTransceiver client = null;
try {
client = new NettyTransceiver(new InetSocketAddress(InetAddress.getByName("129.28.206.27"), 7999), 3000l);
// client code - attach to the server and send a message
Mail proxy = (Mail) SpecificRequestor.getClient(Mail.class, client);
System.out.println("Client built, got proxy");
// fill in the Message record and send it
Message message = new Message();
message.setTo(new Utf8(args[0]));
message.setFrom(new Utf8(args[1]));
message.setBody(new Utf8(args[2]));
System.out.println("Calling proxy.send with message: " + message.toString());
System.out.println("Result: " + proxy.send(message));
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
// cleanup
if(client != null) {
client.close();
}
}
}
// server.close();
}
}
The error log:
Starting server
Server started
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Error connecting to /129.28.206.27:7999
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.base/java.nio.Bits.reserveMemory(Bits.java:175)
at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:118)
at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:317)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$Preallocation.<init>(SocketSendBufferPool.java:156)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool.<init>(SocketSendBufferPool.java:42)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.newWorker(NioWorkerPool.java:44)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.newWorker(NioWorkerPool.java:28)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:80)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:151)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:116)
at org.apache.avro.ipc.netty.NettyTransceiver.<init>(NettyTransceiver.java:127)
at example.Main.main(Main.java:69)
The JVM parameter:
-XX:MaxDirectMemorySize=8m -Dio.netty.leakDetection.level=advanced
--
This message was sent by Atlassian Jira
(v8.3.2#803003)