LB Booster
Programming >> Compatibility with LB4 >> LBB (initial) memory usage
http://lbb.conforums.com/index.cgi?board=compatibility&action=display&num=1426836898

LBB (initial) memory usage
Post by tsh73 on Mar 20th, 2015, 07:34am

I wonder if I am the only person who consider that to be a problem.
Since version 2.60,
>> The amount of memory available has been increased to 500 Megabytes.
But that looks like 500 Megabytes is grabbed on each start of a program.
So, on my machine (I know it's old) with 1Gb RAM and Win XP, it works like this (looking at Process Explorer):
Just after reboot (only big program running is Outlook)
commit charge:
current 684 700
limit 2 069 828
After starting EXE compiled with LBB:
current 1 200 000
2nd exe:
1 720 000
3rd:
2 244 000
commit charge shows 99%
That's all - any other attempts ends with "No room" error
It just irks me that any small program eats up 500mb memory. With 100mb, I just did not bumped into this. What was the reason anyway? I have read that in LBB, one can use REDIM to get array of any size which memory allows.
Re: LBB (initial) memory usage
Post by Richard Russell on Mar 20th, 2015, 09:20am

on Mar 20th, 2015, 07:34am, tsh73 wrote:
But that looks like 500 Megabytes is grabbed on each start of a program.

No, it's 500 Mbytes of virtual memory (address space), not real memory. I've just run a small executable compiled using LBB v3.00, and Task Manager is reporting that it is using 17.6 Mbytes of memory (Windows 8.1), which I don't think is too bad.

Edit: Just compiled a program consisting of the single statement wait. Task Manager reports 1.9 Mbytes memory usage.

Quote:
What was the reason anyway?

For improved compatibility with LB4.5, which reserves 1 Gbyte of virtual memory (compared with the 70 Mbytes or so of LB 4.04).

Richard.

Re: LBB (initial) memory usage
Post by Richard Russell on Mar 20th, 2015, 10:15am

Sixteen copies of the program running:

User Image
Re: LBB (initial) memory usage
Post by tsh73 on Mar 20th, 2015, 10:29am

Ok, 16 copies - more then enough.
So I'll say it's just sign of long overdue upgrade in my part.
Please tell how much memory your machine has and what is the OS?
EDIT I see the OS - Windows 8.1
Re: LBB (initial) memory usage
Post by Hans on Mar 20th, 2015, 10:29am

It has something to do whith the way you retreive the amount of memory used. I use the code below since long in a number of LB apps. In LBB the result is always 500, but the Taskmanager gives much lower amounts, more believeble. That's why I've now included an extra if statement for LBB.
Because in LBB one has almost infinite memory, it is not high on my prioritylist but I will have to look for another way to retreive the amount of memory.

Hans

Code:
FUNCTION GetUsedMemory(byref ErrorMsg$)
'=returns the memory used by the current process
'returns -1 if an error is encountered
'the error message is stored in the submitted variable
    ErrorMsg$ = ""
    struct ProcessMemoryCounters, _
        cb                         as ulong,_
        PageFaultCount             as ulong,_
        PeakWorkingSetSize         as ulong,_
        WorkingSetSize             as ulong,_
        QuotaPeakPagedPoolUsage    as ulong,_
        QuotaPagedPoolUsage        as ulong,_
        QuotaPeakNonPagedPoolUsage as ulong,_
        QuotaNonPagedPoolUsage     as ulong,_
        PagefileUsage              as ulong,_
        PeakPagefileUsage          as ulong
    ProcessMemoryCounters.cb.struct = len(ProcessMemoryCounters.struct)
    open "psapi.dll" for dll as #psapi
    calldll #kernel32, "GetCurrentProcess",hProcess as ulong
    cb = len(ProcessMemoryCounters.struct)
    calldll #psapi, "GetProcessMemoryInfo",_
        hProcess              as ulong,_
        ProcessMemoryCounters as struct,_
        cb                    as ulong,_
        result                as long
    if result then
        GetUsedMemory = ProcessMemoryCounters.PagefileUsage.struct
    else
        call GetLastError ErrorMsg$
        GetUsedMemory = -1
    end if
    close #psapi
    UsedMemory = GetUsedMemory/1000000 'convert to MB
    if instr(version$,"LBB")<>1 then
        if UsedMemory>65 then notice "Memory nearly full: "+using("####",UsedMemory)
    end if
END FUNCTION
SUB GetLastError byref Message$
    calldll #kernel32, "GetLastError", ErrorCode as ulong
    dwFlags = _FORMAT_MESSAGE_FROM_SYSTEM
    nSize = 1024
    lpBuffer$ = space$(nSize); chr$(0)
    dwMessageID = ErrorCode
    calldll #kernel32, "FormatMessageA", _
        dwFlags      as ulong, _
        lpSource     as ulong, _
        dwMessageID  as ulong, _
        dwLanguageID as ulong, _
        lpBuffer$    as ptr, _
        nSize        as ulong, _
        Arguments    as ulong, _
        result       as ulong
    Message$ = left$(lpBuffer$, result)
END SUB
 

Re: LBB (initial) memory usage
Post by Richard Russell on Mar 20th, 2015, 12:21pm

on Mar 20th, 2015, 10:29am, Hans wrote:
It has something to do whith the way you retreive the amount of memory used.

The problem is that both you and Anatoly are measuring the Commit Charge, which is the amount of memory a process has said it might use.

But this reserved address space does not actually use up real memory, until you create variables, arrays, structures, strings etc. to occupy it. In other words it doesn't reduce the memory available to other processes, which run in their own private address spaces.

This article has some interesting information. In particular read the section So what is “commit?”:

http://brandonlive.com/2010/02/21/measuring-memory-usage-in-windows-7/

Specifically it warns that if you disable your page file then Windows will reserve real memory rather than virtual memory, and then LBB really will gobble up 500 Mbytes of RAM!

Richard.