Go to file
ian fde13d96f9 Fix error that causes (up to) double memory usage
Motivation:

PoolArena's 'normalizeCapacity' function was micro-optimized some
time ago to remove a while loop. However, there was a change of
behavior in the function as a result. Capacities passed into it
that are already powers of 2 (and >= 512) are doubled in size. So
if I ask for a buffer with a capacity of 1024, I will get back one
that actually uses 2048 bytes (stored in maxLength).

Aligning to powers of two for book keeping ease is reasonable,
and if someone tries to expand a buffer, you might as well use some
of the previously wasted space. However, since this distinction
between 'easily expanded' and 'costly to expand' space is not
supported at all by the APIs, I cannot imagine this change to
doubling is desirable or intentional.

This is especially costly when using composite buffers. They
frequently allocate components with a capacity that is a power of
2, and they never attempt to expand components themselves. The end
result is that heavy use of pool-backed composite buffers wastes
almost half of the memory pool (the smaller / initial components are
<512 and so are not affected by the off-by-one bug).

Modifications:

Although I find it difficult to believe that such an optimization
is really helpful, I left it in and fixed the off-by-one issue by
decrementing the value at the start.

I also added a simple test to both attempt to verify that the
decrement fixes the issue without introducing any other change, and
to make it easy for a reviewer to test the existing behavior. PoolArena
does not seem to have much testing or testability support though so
the test is kind of a hack and will break for unrelated changes. I
suggest either removing it or factoring out the single non-static
portion of normalizeCapacity so that the fragile dummy PoolArena is
not required.

Result:

Pooled allocators will allocate less resources to the highly
inefficient and undocumented buffer section between length and
maxLength.

Composite buffers of non-trivial size that are backed by pooled
allocators will use about half as much memory.
2014-04-15 07:02:49 +02:00
all [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
buffer Fix error that causes (up to) double memory usage 2014-04-15 07:02:49 +02:00
codec [#2353] Use a privileged block to get ClassLoader and System property if needed 2014-04-08 13:59:03 +02:00
codec-http [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
codec-socks [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
common [#2353] Use a privileged block to get ClassLoader and System property if needed 2014-04-08 13:59:03 +02:00
example [#2353] Use a privileged block to get ClassLoader and System property if needed 2014-04-08 13:59:03 +02:00
handler [#2353] Use a privileged block to get ClassLoader and System property if needed 2014-04-08 13:59:03 +02:00
license [#1259] Add optimized queue for SCMP pattern and use it in NIO and native transport 2014-02-27 11:44:06 +01:00
microbench [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
tarball [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
testsuite [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
transport [#2390] Minimize memory usage of NioDatagramChannel 2014-04-15 06:55:51 +02:00
transport-native-epoll [#2371] Fix data corruption caused by EpollSocketChannel when writing 2014-04-13 09:54:16 +02:00
transport-rxtx [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
transport-sctp [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
transport-udt [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
.fbfilter.xml Update license headers 2012-06-04 13:31:44 -07:00
.fbprefs Updated Find Bugs configuration 2009-03-04 10:33:09 +00:00
.gitignore Format and partially describe Gitignore 2013-12-10 07:04:38 +01: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:18:14 +09:00
LICENSE.txt Relicensed to Apache License v2 2009-08-28 07:15:49 +00:00
NOTICE.txt [#1259] Add optimized queue for SCMP pattern and use it in NIO and native transport 2014-02-27 11:44:06 +01:00
pom.xml [maven-release-plugin] prepare for next development iteration 2014-04-01 07:21:40 +02:00
README.md Update README.md 2014-01-16 14:38:36 +09: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

The 'master' branch is where the development of the latest major version lives on. The development of all other major versions takes place in each branch whose name is identical to its major version number. For example, the development of 3.x and 4.x resides in the branch '3' and the branch '4' respectively.