Go to file
Carl Mastrangelo 16b1dbdf92 Motivation: Resource Leak Detector (RLD) tries to helpfully indicate where an object was last accessed and report the accesses in the case the object was not cleaned up. It handles lightly used objects well, but drops all but the last few accesses.
Configuring this is tough because there is split between highly shared (and accessed) objects and lightly accessed objects.

Modification:
There are a number of changes here.  In relative order of importance:

API / Functionality changes:
* Max records and max sample records are gone.  Only "target" records, the number of records tries to retain is exposed.
* Records are sampled based on the number of already stored records.  The likelihood of recording a new sample is `2^(-n)`, where `n` is the number of currently stored elements.
* Records are stored in a concurrent stack structure rather than a list.  This avoids a head and tail.  Since the stack is only read once, there is no need to maintain head and tail pointers
* The properties of this imply that the very first and very last access are always recorded.  When deciding to sample, the top element is replaced rather than pushed.
* Samples that happen between the first and last accesses now have a chance of being recorded.  Previously only the final few were kept.
* Sampling is no longer deterministic.  Previously, a deterministic access pattern meant that you could conceivably always miss some access points.
* Sampling has a linear ramp for low values and and exponentially backs off roughly equal to 2^n.  This means that for 1,000,000 accesses, about 20 will actually be kept.  I have an elegant proof for this which is too large to fit in this commit message.

Code changes:
* All locks are gone.  Because sampling rarely needs to do a write, there is almost 0 contention.  The dropped records counter is slightly contentious, but this could be removed or changed to a LongAdder.  This was not done because of memory concerns.
* Stack trace exclusion is done outside of RLD.  Classes can opt to remove some of their methods.
* Stack trace exclusion is faster, since it uses String.equals, often getting a pointer compare due to interning.  Previously it used contains()
* Leak printing is outputted fairly differently.  I tried to preserve as much of the original formatting as possible, but some things didn't make sense to keep.

Result:
More useful leak reporting.

Faster:
```
Before:
Benchmark                                           (recordTimes)   Mode  Cnt       Score      Error  Units
ResourceLeakDetectorRecordBenchmark.record                      8  thrpt   20  136293.404 ± 7669.454  ops/s
ResourceLeakDetectorRecordBenchmark.record                     16  thrpt   20   72805.720 ± 3710.864  ops/s
ResourceLeakDetectorRecordBenchmark.recordWithHint              8  thrpt   20  139131.215 ± 4882.751  ops/s
ResourceLeakDetectorRecordBenchmark.recordWithHint             16  thrpt   20   74146.313 ± 4999.246  ops/s

After:
Benchmark                                           (recordTimes)   Mode  Cnt       Score      Error  Units
ResourceLeakDetectorRecordBenchmark.record                      8  thrpt   20  155281.969 ± 5301.399  ops/s
ResourceLeakDetectorRecordBenchmark.record                     16  thrpt   20   77866.239 ± 3821.054  ops/s
ResourceLeakDetectorRecordBenchmark.recordWithHint              8  thrpt   20  153360.036 ± 8611.353  ops/s
ResourceLeakDetectorRecordBenchmark.recordWithHint             16  thrpt   20   78670.804 ± 2399.149  ops/s
```
2017-10-19 12:21:21 -07:00
.github Use GitHub Issue/PR Template Feature 2016-12-07 11:40:26 -08:00
all [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
bom [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
buffer Motivation: Resource Leak Detector (RLD) tries to helpfully indicate where an object was last accessed and report the accesses in the case the object was not cleaned up. It handles lightly used objects well, but drops all but the last few accesses. 2017-10-19 12:21:21 -07:00
codec Do not treat errors as decoder exception (redux) 2017-10-07 18:17:00 +02:00
codec-dns [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-haproxy Do not treat errors as decoder exception (redux) 2017-10-07 18:17:00 +02:00
codec-http Use predefined HttpResponseStatus constant instead of hardcoded 101 code 2017-10-02 18:58:12 +02:00
codec-http2 [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-memcache [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-mqtt [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-redis [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-smtp [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-socks Do not treat errors as decoder exception (redux) 2017-10-07 18:17:00 +02:00
codec-stomp [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
codec-xml [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
common Motivation: Resource Leak Detector (RLD) tries to helpfully indicate where an object was last accessed and report the accesses in the case the object was not cleaned up. It handles lightly used objects well, but drops all but the last few accesses. 2017-10-19 12:21:21 -07:00
dev-tools [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
example [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
handler Do not treat errors as decoder exception (redux) 2017-10-07 18:17:00 +02:00
handler-proxy [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
license Remove reference to akka code and ArrayDeque which is not part of netty anymore 2017-03-07 21:30:51 +01:00
microbench Optimistically update ref counts 2017-10-04 08:42:33 +02:00
resolver [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
resolver-dns [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
tarball [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
testsuite [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
testsuite-autobahn [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
testsuite-osgi [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
transport extract self() method to avoid too many unchecked @SuppressWarnings 2017-09-27 13:25:16 +02:00
transport-native-epoll Propagate all exceptions when loading native code 2017-10-04 08:45:27 +02:00
transport-native-kqueue Fail the connectPromise with the correct exception if the connection is refused when using the native kqueue transport. 2017-10-07 21:33:26 +02:00
transport-native-unix-common [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
transport-native-unix-common-tests [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
transport-rxtx [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
transport-sctp [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
transport-udt [maven-release-plugin] prepare for next development iteration 2017-09-25 06:12:32 +02:00
.fbprefs Updated Find Bugs configuration 2009-03-04 10:33:09 +00:00
.gitignore Use shaded dependency on JCTools instead of copy and paste 2016-06-10 13:19:45 +02:00
.travis.yml Travis CI branch whitelisting 2013-03-11 09:55:43 +09:00
CONTRIBUTING.md Move the pull request guide to the developer guide 2014-03-12 13:13:58 +09:00
LICENSE.txt Relicensed to Apache License v2 2009-08-28 07:15:49 +00:00
NOTICE.txt Remove reference to akka code and ArrayDeque which is not part of netty anymore 2017-03-07 21:30:51 +01:00
pom.xml Update JCTools version 2017-10-07 18:10:29 +02:00
README.md Updating Branches to look section to match the current branching structure of the project 2016-03-10 22:08:01 +01:00
run-example.sh Add UptimeServer and adjust UptimeClient's code style. 2017-04-28 07:41:07 +02:00

Netty Project

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

How to build

For the detailed information about building and developing Netty, please visit the developer guide. This page only gives very basic information.

You require the following to build Netty:

Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+) is enough to run your Netty-based application.

Branches to look

Development of all versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>. For example, the development of 3.9 and 4.0 resides in the branch '3.9' and the branch '4.0' respectively.