Our problem is that we can't even create a new interpreter state -- luaL_newstate() fails. On 16 Oct 2014, at 00:30, Alex <initrd.gz@xxxxxxxxx> wrote: > The 4GB limit only applies to Lua objects and cdata allocated with ffi.new or > from ffi.typeof constructors. If you use malloc directly (via declaring it > with ffi.cdef then using it with ffi.C.malloc), you can use memory outside of > the limit. > > On Wed, Oct 15, 2014 at 6:28 PM, Nicholas Hutchinson > <nick.hutchinson@xxxxxxxxxxxxxxxx> wrote: > Hi all, > > A (64-bit Linux) product I'm working on is running into issues relating to: > - LuaJIT's requirement that the interpreter state reside in the first 4GB of > your process' address space > - its default allocator (see lj_alloc.c) getting memory from the system using > mmap() with the MAP_32BIT flag, which further restricts LuaJIT to using using > the first 2GB of your process' address space > > I gather there are cases where we're trying to initialise a Lua interpreter > state quite late in the piece, and that this fails as we've exhausted that > lower 2GB portion of our address space. I'd love to hear other people's > experiences and how they're working around this limitation. The suggestions > I've read seem to boil down to: > > - switching to a different memory allocator such as tcmalloc or jemalloc -- > tcmalloc can be configured to use mmap() rather than sbrk() to request memory > from the system, and jemalloc seems to always use mmap(). As I understand it, > mmap() generally (always?) returns memory from >= 4GB, so the the lower > portion would then be free for LuaJIT. > - customising LuaJIT's own memory allocator -- at process startup, allocate > some suitably large chunk of memory from the < 4GB region and dole it out to > LuaJIT in chunks. > > Am I missing something simpler? > > Finally, is there any chance restriction is going to be relaxed in a future > version of LuaJIT? > > Thanks, > Nick > > > > -- > Sincerely, > Alex Parrill