SlideShare uma empresa Scribd logo
1 de 98
Baixar para ler offline
Highload reactive server
with Netty
Dmitriy Dumanskiy
Blynk, CTO
Java blog : https://habrahabr.ru/users/doom369/topics
DOU : https://dou.ua/users/DOOM/articles/
Makers problem
+ = ?
Makers problem
● Http/s
● Mqtt
● WebSockets
● Own binary protocol
Blynk
10000 req/sec
3 VM * 2 cores, 60$
25% load
10k of local installations
Why netty?
Cassandra
Apache Spark
Elasticsearch
Graylog
Neo4j
Vert.x
HornetQInfinispan
Finagle
Async-http-client
Firebase
Akka
CouchbasePlay framework
Redisson
Why netty?
~700k servers
Why netty?
● Less GC
Why netty?
● Less GC
● Optimized for Linux based OS
Why netty?
● Less GC
● Optimized for Linux based OS
● High performance buffers
Why netty?
● Less GC
● Optimized for Linux based OS
● High performance buffers
● Well defined threading model
Why netty?
● Less GC
● Optimized for Linux based OS
● High performance buffers
● Well defined threading model
● HTTP, HTTP/2, SPDY, SCTP, TCP,
UDP, UDT, MQTT, etc
When to use?
● Performance is critical
When to use?
● Performance is critical
● Own protocol
When to use?
● Performance is critical
● Own protocol
● Full control over network
(so_reuseport, tcp_cork,
tcp_fastopen, tcp_nodelay, etc)
When to use?
● Performance is critical
● Own protocol
● Full control over network
● Game engines (agario, slither,
minecraft)
When to use?
● Performance is critical
● Own protocol
● Full control over network
● Game engines
● <3 reactive
Non-Blocking
● Few threads
● No context switching
● No memory consumption
Non-Blocking
new Channel
read / write
Selector
Thread
new Channel
read / write
new Channel
read / write
java.nio.channels.Selector
Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
if (key.isReadable()) { ... }
}
}
Selector selector = Selector.open(); // creating selector
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
if (key.isReadable()) { ... }
}
}
Selector selector = Selector.open();
channel.configureBlocking(false);
//registering channel with selector, listening for READ events only
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
if (key.isReadable()) { ... }
}
}
Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select(); //blocking until we get some READ events
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
if (key.isReadable()) { ... }
}
}
Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select();
//now we have channels with some data
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
if (key.isReadable()) { ... }
}
}
Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
key = keyIterator.next();
//do something with data
if (key.isReadable()) { key.channel() }
}
}
Flow
Selector
SelectionKey
Channel
ChannelPipeline
Flow
ChannelPipeline
fireEvent()
invokeChannelRead() executor.execute()
invokeChannelRead()
Minimal setup
ServerBootstrap b = new ServerBootstrap();
b.group(
new NioEventLoopGroup(1),
new NioEventLoopGroup()
) .channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {...});
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
Minimal setup
ServerBootstrap b = new ServerBootstrap();
b.group(
new NioEventLoopGroup(1), //IO thread
new NioEventLoopGroup()
) .channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {...});
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
Minimal setup
ServerBootstrap b = new ServerBootstrap();
b.group(
new NioEventLoopGroup(1),
new NioEventLoopGroup() //worker threads
) .channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {...});
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
Minimal setup
ServerBootstrap b = new ServerBootstrap();
b.group(
new NioEventLoopGroup(1),
new NioEventLoopGroup() //worker threads
) .channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {...}); //pipeline init
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
Minimal setup
new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
final ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new MyLogicHere());
}
};
ChannelPipeline
ChannelPipeline
● Inbound event ->
ChannelInboundHandler (CIHA)
● Outbound event ->
ChannelOutboundHandler (COHA)
ChannelInboundHandler
public interface ChannelInboundHandler extends ChannelHandler {
...
void channelRegistered(ChannelHandlerContext ctx);
void channelActive(ChannelHandlerContext ctx);
void channelRead(ChannelHandlerContext ctx, Object msg);
void userEventTriggered(ChannelHandlerContext ctx, Object evt);
void channelWritabilityChanged(ChannelHandlerContext ctx);
...
}
void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(new MyProtocolDecoder())
.addLast(new MyProtocolEncoder())
.addLast(new MyLogicHandler());
}
Own tcp/ip server
Channel
MyProtocolDecoder
MyLogicHandler
Own tcp/ip server
Channel
MyProtocolEncoder
MyLogicHandler
Handlers
HttpServerCodec
ChannelTrafficShapingHandler
IdleStateHandler
ReadTimeoutHandler
ChunkedWriteHandler
SslHandler
LoggingHandler
RuleBasedIpFilter
StringDecoder
JsonObjectDecoder
Base64DecoderJZlibDecoder
JZlibDecoder
Lz4FrameDecoder
ProtobufDecoder
ObjectDecoder
XmlFrameDecoder
void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(new HttpRequestDecoder())
.addLast(new HttpResponseEncoder())
.addLast(new MyHttpHandler());
}
Http Server
void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(new HttpServerCodec())
.addLast(new MyHttpHandler());
}
OR
void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(new HttpServerCodec())
.addLast(new MyHttpHandler());
}
Https Server
void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(new HttpServerCodec())
.addLast(new HttpContentCompressor())
.addLast(new MyHttpHandler());
}
Https Server + content gzip
@Override
public void channelRead(Context ctx, Object msg) {
//pass flow processing to next handler
super.channelRead(ctx, msg);
}
Pipeline flow
@Override
public void channelRead(Context ctx, Object msg) {
//stop request processing
return;
}
Pipeline flow
public void channelRead(Context ctx, Object msg) {
If (msg instanceOf LoginMessage) {
LoginMessage login = (LoginMessage) msg;
if (isSuperAdmin(login)) {
ctx.pipeline().remove(this);
ctx.pipeline().addLast(new SuperAdminHandler());
}
}
Pipeline flow on the fly
public void channelRead(Context ctx, Object msg) {
ChannelFuture cf = ctx.writeAndFlush(response);
cf.addListener(new ChannelFutureListener() {
@Override
public void complete(ChannelFuture future) {
future.channel().close();
}
});
}
Pipeline futures
@Override
public void channelRead(Context ctx, Object msg) {
ChannelFuture cf = ctx.writeAndFlush(response);
//close connection after message was delivered
cf.addListener(ChannelFutureListener.CLOSE);
}
Pipeline futures
@Override
public void channelRead(Context ctx, Object msg) {
...
ChannelFuture cf = ctx.writeAndFlush(response);
cf.addListener(future -> {
...
});
}
Pipeline futures
public void channelRead(Context ctx, Object msg) {
ChannelFuture cf = session.sendMsgToFriend(msg);
cf.addListener(new ChannelFutureListener() {
@Override
public void complete(ChannelFuture future) {
future.channel().writeAndFlush(“Delivered!”);
}
});
}
Pipeline futures
Pipeline blocking IO
Non blocking pools Blocking pools
IO Event Loops
DB
Worker Event Loops
Mailing
File system
public void channelRead(Context ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest req = (HttpRequest) msg;
if (req.method() == GET && req.uri().eq(“/users”)) {
Users users = dbManager.userDao.getAllUsers();
ctx.writeAndFlush(new Response(users));
}
}
Pipeline blocking IO
public void channelRead(Context ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest req = (HttpRequest) msg;
if (req.method() == POST && req.uri().eq(“/email”)) {
mailManager.sendEmail();
}
}
Pipeline blocking IO
public void channelRead(Context ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest req = (HttpRequest) msg;
if (req.method() == GET && req.uri().eq(“/property”)) {
String property = fileManager.readProperty();
ctx.writeAndFlush(new Response(property));
}
}
}
Pipeline blocking IO
public void channelRead(Context ctx, Object msg) {
...
blockingThreadPool.execute(() -> {
Users users = dbManager.userDao.getAllUsers();
ctx.writeAndFlush(new Response(users));
});
}
Pipeline blocking IO
Pipeline blocking IO
● Thread.sleep()
Pipeline blocking IO
● Thread.sleep()
● java.util.concurrent.*
Pipeline blocking IO
● Thread.sleep()
● java.util.concurrent.*
● Intensive operations
Pipeline blocking IO
● Thread.sleep()
● java.util.concurrent.*
● Intensive operations
● Any blocking IO (files, db, smtp, etc)
Pipeline blocking IO
● Thread.sleep()
● java.util.concurrent.*
● Intensive operations
● Any blocking IO (files, db, smtp, etc)
@Override
public void channelInactive(Context ctx) {
HardwareState state = getState(ctx.channel());
if (state != null) {
ctx.executor().schedule(
new DelayedPush(state), state.period, SECONDS
);
}
}
EventLoop is Executor!
public void channelRead(Context ctx, Object msg) {
if (msg instanceof FullHttpRequest) {
FullHttpRequest request = (FullHttpRequest) msg;
User user = sessionDao.checkCookie(request);
...
}
super.channelRead(ctx, msg);
}
Request state
private static AttributeKey<User>
USER_KEY = AttributeKey.valueOf("user");
ctx.channel().attr(USER_KEY).set(user);
Request state
public void channelRead(Context ctx, Object msg) {
if (msg instanceof FullHttpRequest) {
FullHttpRequest request = (FullHttpRequest) msg;
User user = sessionDao.checkCookie(request);
ctx.channel().attr(USER_KEY).set(user);
}
super.channelRead(ctx, msg);
}
Request state
if (isSsl(in)) {
enableSsl(ctx);
} else {
if (isGzip()) {
enableGzip(ctx);
} else if (isHttp(in)) {
switchToHttp(ctx);
}
Port unification
Back pressure
if (channel.isWritable()) {
channel.writeAndFlush(msg);
}
Back pressure
BackPressureHandler
coming soon...
Performance
Performance
https://www.techempower.com/benchmarks/#section=data-r13&hw=ph&test=plaintext
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<version>${netty.version}</version>
<classifier>${os}</classifier>
</dependency>
Native transport
Bootstrap b = new Bootstrap();
b.group(new EpollEventLoopGroup());
b.channel(EpollSocketChannel.class);
Native transport
SslContextBuilder.forServer()
.sslProvider(SslProvider.OpenSsl);
JNI OpenSslEngine
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>${netty.boring.ssl.version}</version>
<classifier>${os}</classifier>
</dependency>
JNI OpenSslEngine
● Netty-tcnative
● netty-tcnative-libressl
● netty-tcnative-boringssl-static
JNI OpenSslEngine
Own ByteBuf
Own ByteBuf
● Reference counted
● Pooling by default
● Direct memory by default
● LeakDetector by default
● Reduced branches, range-checks
Own ByteBuf
● ByteBufAllocator.buffer(size);
● ctx.alloc().buffer(size);
● channel.alloc().buffer(size);
Less system calls
for (Message msg : messages) {
ctx.writeAndFlush(msg);
}
Less system calls
for (Message msg : messages) {
ctx.write(msg);
}
ctx.flush();
Thread Model
ChannelFuture inCf = ctx.deregister();
inCf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture cf) {
targetLoop.register(cf.channel())
.addListener(completeHandler);
}
});
Reusing Event Loop
new ServerBootstrap().group(
new EpollEventLoopGroup(1),
new EpollEventLoopGroup()
).bind(80);
Reusing Event Loop
EventLoopGroup boss = new EpollEventLoopGroup(1);
EventLoopGroup workers = new EpollEventLoopGroup();
new ServerBootstrap().group(
boss,
workers
).bind(80);
new ServerBootstrap().group(
boss,
workers
).bind(443);
Use direct buffers
ctx.writeAndFlush(
new ResponseMessage(messageId, OK)
);
Use direct buffers
ByteBuf buf = ctx.alloc().buffer(3);//pool
buf.writeByte(messageId);
buf.writeShort(OK);
ctx.writeAndFlush(buf);
Less allocations
ByteBuf msg = makeResponse(...);
msg.retain(targets.size() - 1);
for (Channel ch : targets) {
ch.writeAndFlush(msg);
}
Void promise
ctx.writeAndFlush(
response
);
Void promise
ctx.writeAndFlush(
response, ctx.voidPromise()
);
Reuse handlers
@Sharable
public class StringDecoder extends
MessageToMessageDecoder<ByteBuf> {
...
}
Prefer context
ctx.channel().writeAndFlush();
Prefer context
ctx.channel().writeAndFlush();
ctx.writeAndFlush();
Simpler - faster
ChannelInboundHandlerAdapter
does nothing, but fast
Simpler - faster
ByteToMessageDecoder
does some work, but slower
Simpler - faster
ReplayingDecoder
does job for you, but slowest
Turn off leak detection
ResourceLeakDetector.setLevel(
ResourceLeakDetector.Level.DISABLED);
What else?
● ASCIIString
● FastThreadLocal
● Unsafe
● Optimized Encoders
● Really fast
● Low GC load
● Flexible
● Rapidly evolve
● Cool support
Summary
● Hard
● Memory leaks
● Still have issues
Summary
https://github.com/blynkkk/blynk-server

Mais conteúdo relacionado

Mais procurados

Streams are Awesome - (Node.js) TimesOpen Sep 2012
Streams are Awesome - (Node.js) TimesOpen Sep 2012 Streams are Awesome - (Node.js) TimesOpen Sep 2012
Streams are Awesome - (Node.js) TimesOpen Sep 2012
Tom Croucher
 

Mais procurados (20)

Storing 16 Bytes at Scale
Storing 16 Bytes at ScaleStoring 16 Bytes at Scale
Storing 16 Bytes at Scale
 
Java NIO.2
Java NIO.2Java NIO.2
Java NIO.2
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
WebTalk - Implementing Web Services with a dedicated Java daemon
WebTalk - Implementing Web Services with a dedicated Java daemonWebTalk - Implementing Web Services with a dedicated Java daemon
WebTalk - Implementing Web Services with a dedicated Java daemon
 
FPV Streaming Server with ffmpeg
FPV Streaming Server with ffmpegFPV Streaming Server with ffmpeg
FPV Streaming Server with ffmpeg
 
Streams are Awesome - (Node.js) TimesOpen Sep 2012
Streams are Awesome - (Node.js) TimesOpen Sep 2012 Streams are Awesome - (Node.js) TimesOpen Sep 2012
Streams are Awesome - (Node.js) TimesOpen Sep 2012
 
An Introduction to Twisted
An Introduction to TwistedAn Introduction to Twisted
An Introduction to Twisted
 
Commication Framework in OpenStack
Commication Framework in OpenStackCommication Framework in OpenStack
Commication Framework in OpenStack
 
How we use Twisted in Launchpad
How we use Twisted in LaunchpadHow we use Twisted in Launchpad
How we use Twisted in Launchpad
 
NodeJs
NodeJsNodeJs
NodeJs
 
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
 
Loom and concurrency latest
Loom and concurrency latestLoom and concurrency latest
Loom and concurrency latest
 
Ice mini guide
Ice mini guideIce mini guide
Ice mini guide
 
Jafka guide
Jafka guideJafka guide
Jafka guide
 
Reactive programming with examples
Reactive programming with examplesReactive programming with examples
Reactive programming with examples
 
Pemrograman Jaringan
Pemrograman JaringanPemrograman Jaringan
Pemrograman Jaringan
 
WTF is Twisted?
WTF is Twisted?WTF is Twisted?
WTF is Twisted?
 
Winter is coming? Not if ZooKeeper is there!
Winter is coming? Not if ZooKeeper is there!Winter is coming? Not if ZooKeeper is there!
Winter is coming? Not if ZooKeeper is there!
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
Nginx Internals
Nginx InternalsNginx Internals
Nginx Internals
 

Semelhante a Reactive server with netty

Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"
Fwdays
 
Unity and WebSockets
Unity and WebSocketsUnity and WebSockets
Unity and WebSockets
Josh Glover
 
Store and Process Big Data with Hadoop and Cassandra
Store and Process Big Data with Hadoop and CassandraStore and Process Big Data with Hadoop and Cassandra
Store and Process Big Data with Hadoop and Cassandra
Deependra Ariyadewa
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...
Tom Croucher
 

Semelhante a Reactive server with netty (20)

Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
 
Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"
 
Server Side Swift: Vapor
Server Side Swift: VaporServer Side Swift: Vapor
Server Side Swift: Vapor
 
Android dev 3
Android dev 3Android dev 3
Android dev 3
 
#3 (Multi Threads With TCP)
#3 (Multi Threads With TCP)#3 (Multi Threads With TCP)
#3 (Multi Threads With TCP)
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
 
"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr Vronskiy"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr Vronskiy
 
Go Concurrency Patterns
Go Concurrency PatternsGo Concurrency Patterns
Go Concurrency Patterns
 
tdc2012
tdc2012tdc2012
tdc2012
 
Original slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talkOriginal slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talk
 
Unity and WebSockets
Unity and WebSocketsUnity and WebSockets
Unity and WebSockets
 
Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at Pinterest
 
Ad Server Optimization
Ad Server OptimizationAd Server Optimization
Ad Server Optimization
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
Store and Process Big Data with Hadoop and Cassandra
Store and Process Big Data with Hadoop and CassandraStore and Process Big Data with Hadoop and Cassandra
Store and Process Big Data with Hadoop and Cassandra
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...
 
Protocol handler in Gecko
Protocol handler in GeckoProtocol handler in Gecko
Protocol handler in Gecko
 
Go 1.8 'new' networking features
Go 1.8 'new' networking featuresGo 1.8 'new' networking features
Go 1.8 'new' networking features
 
Introduction to Vert.x
Introduction to Vert.xIntroduction to Vert.x
Introduction to Vert.x
 
Curator intro
Curator introCurator intro
Curator intro
 

Mais de Dmitriy Dumanskiy (6)

Java micro optimizations 2017
Java micro optimizations 2017Java micro optimizations 2017
Java micro optimizations 2017
 
JEEConf. Vanilla java
JEEConf. Vanilla javaJEEConf. Vanilla java
JEEConf. Vanilla java
 
Handling 20 billion requests a month
Handling 20 billion requests a monthHandling 20 billion requests a month
Handling 20 billion requests a month
 
Tweaking performance on high-load projects
Tweaking performance on high-load projectsTweaking performance on high-load projects
Tweaking performance on high-load projects
 
JVM performance options. How it works
JVM performance options. How it worksJVM performance options. How it works
JVM performance options. How it works
 
Куда уходит память?
Куда уходит память?Куда уходит память?
Куда уходит память?
 

Último

Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
jaanualu31
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 

Último (20)

A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
Computer Networks Basics of Network Devices
Computer Networks  Basics of Network DevicesComputer Networks  Basics of Network Devices
Computer Networks Basics of Network Devices
 
Moment Distribution Method For Btech Civil
Moment Distribution Method For Btech CivilMoment Distribution Method For Btech Civil
Moment Distribution Method For Btech Civil
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptxS1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.ppt
 
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptxHOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
 
Computer Lecture 01.pptxIntroduction to Computers
Computer Lecture 01.pptxIntroduction to ComputersComputer Lecture 01.pptxIntroduction to Computers
Computer Lecture 01.pptxIntroduction to Computers
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdf
 
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
 
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptxA CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
 
PE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiesPE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and properties
 
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best ServiceTamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
 
AIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsAIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech students
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 

Reactive server with netty