I read about ExpandSystemMomery about in STEP forums and put the question about the latest enb series forum:
TES Skyrim 0.279
"And what about these statement?
Warning:It has been reported that this feature can conflict with "Sheson's Memory Patch 3.0" (now included with SKSE) by causing Skyrim to crash if the memory patch fix is used to increase Skyrim's initial heap allocation (Block 1 or DefaultHeapInitialAllocMB in skse.ini) higher than 512MB (or 768MB for some). Therefore, if using the Sheson Memory Patch fix (either standalone or with SKSE), it is recommended to set ExpandSystemMemoryX64 to false.
source: STEP EnbGuide
And got these answers:
"ExpandSystemMemoryX64 is very specific thing which do not produce any bugs itself, but the reason of game or mods bugs to appear if they are exist. Kinda same thing happen with 4gb laa patch for oblivion, fallout and old skyrim. There are three levels of same mistake which leads to incompatibility. First one is for 32 bit applications with 2gb memory limit per process, like WinXP and older OS. Second level is 4gb native limit of 32
bit applications and it's the case of ExpandSystemMemoryX64 or 4gb LAA patches. Third is x64 memory ranges and they are not the case of skyrim, because only developers may recompile the same code and bugs will occur, if exists. And the bug itself is when code contains arithmetic operations of memory addresses which may return wrong values if address range is above 2 gb (and 4 gb for x64 version). ExpandSystemMemoryX64 primary goal is to fix memory fragmentation issues which is very problematic thing in almost all games, fragmented memory reduce amount of really available free memory. The best use of this parameter is on vista and higher os. On xp it works too, but have very minor effect."
And something like that:
I used ENBoost along with the SKSE Memory Fix and DefaultHeapInitialAllocMB=768 for 100s of hours and I never had any problem. Super stable, no ILS, no CTD.
Just to clarify here -
The "Sheson Memory Patch 3.0" does not change the way TESV.exe (Skyrim's app) allocates memory in its 4GB memory space. Those two "blocks" of heap memory were already programmed by Bethesda to be created when TESV.exe is started. By default, TESV.exe allocates 256MB of memory to both of those blocks.
The problem is that when the "Block 1" / Default Heap usage hits 256MB, the routine the programmers used to automatically increase the size of the "Block 1" / Default Heap is flawed, and causes a memory exception error, leading to the instant CTD. This almost always happens as the player is crossing the invisible border of an exterior worldspace cell.
Sheson pinpointed the exact two bytes in the TESV.exe binary code which tell the program the default amount memory to allocate to those two blocks of heap memory, and the SKSE team incorporated Sheson's method of writing new values to those two bytes of the program code during SKSE initialization process, before TESV.exe actually starts running.
So, this allows the user to manually increase the default "Block 1" / Default Heap allocation, and as a result avoids the problem of the memory exception error, because if you set the default allocation higher than the actual highest memory usage of the "Block 1" heap, then the flawed routine to increase the heap's size never has to be run, and you don't get CTDs for that reason.
Sheson also included access to adjust another block of heap memory, called "Block 2", because some people found that when the "Block 1" heap allocation was set to 768MB or higher, then Skyrim would crash upon startup. The workaround for this was to set the initial "Block 2" heap (called the "Scrap Heap" in the SKSE.ini) to 512MB instead of its default 256MB.
However, with the great help of Hishtup, I figured out that the "Block 2" scrap heap only needs to be raised to 512MB when ExpandSystemMemoryX64 is set to true. If ExpandSystemMemoryX64 is set to false, then the "Block 1" / Default heap can be set higher than 768MB without the need to set the "Block 2" scrap heap to 512MB.
Also very important - in my extensive testing using a program that allows you to track the exact usage of these two blocks of heap memory, I discovered that the "Block 2" scrap heap" never uses more than 256MB, even when you set it to 512MB. However, when its set to 512MB, that extra 256MB of allocated memory is "locked" out, and TESV.exe can't use it for any purpose.
The last thing in my testing that I found is that setting ExpandSystemMemoryX64 to true did not significantly increase available free memory in TESV.exe as compared to it being set to false. And it especially doesn't outweigh the loss of 256MB of memory if you have to set the "Block 2" scrap heap to 512MB because you need to set the "Block 1" default heap over 768MB.
Again - the benefits of setting ExpandSystemMemoryX64 to true do not outweigh the downside of having to set the "Block 2" scrap heap up to 512MB to avoid Skyrim crashing because "Block 1" is set to 768MB or higher.
Because of all of that, the STEP Guide recommends setting ExpandSystemMemoryX64 to false.
However, I think the wording of the recommendation is a little unclear because of the way the DefaultHeapInitialAllocMB setting works in SKSE.ini --
Every time I said "over 768MB" for the "Block 1" / Default Heap allocation above, I am talking about the "effective" allocation, which is what TESV.exe actually allocates, as would be seen in either the .log file the SKSE produces or by using Sheson's Memory Block Log SKSE plugin.
So, this translates to DefaultHeapInitialAllocMB=1024 in the SKSE.ini file. Remember that the value in the SKSE.ini file must be 256 above the number of MB you want the program to actually use, again which can be verified using Sheson's Memory Block Log SKSE plugin.
Therefore, if someone says they are running with DefaultHeapInitialAllocMB=768, and ExpandSystemMemoryX64=true, and have no problems with CTDs or instability, I am NOT surprised at all.
The problems can start as soon as you find that you need to set DefaultHeapInitialAllocMB to something over 768 in your SKSE.ini file.
For example, with ExpandSystemMemoryX64 set to true, and I set DefaultHeapInitialAllocMB to 800 (which equates to an "effective" allocation of 544MB), Skyrim will crash upon startup, unless I set ScrapHeapSizeMB=512 ("Block 2"), and you now know by doing this, it means I am wasting 256MB of memory. So I would want to set ExpandSystemMemoryX64=false in enblocal.ini, and set ScrapHeapSizeMB=256 in SKSE.ini, and I'm not wasting 256MB of memory and Skyrim doesn't crash.
Boris is right to say that the code he uses to change memory allocation when ExpandSystemMemoryX64 is set to true does not cause bug on its own, but rather what is happen is some kind of interaction between TESV.exe allocation of the two heap memory blocks and his routine under certain circumstances.
The STEP recommendations here are not something pulled out of the dark randomly. Quite a lot of time has been spent and investigation into the reasons for the CTDs, and my explanation above has been confirmed by enough people by now that it's consistent and repeatable.
If in doubt, I recommend you try some tests yourself - in the name of science!
Edited by keithinhanoi, 01 August 2015 - 06:45 AM.