ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   More efficient memory deallocation (https://www.excelbanter.com/excel-programming/375977-more-efficient-memory-deallocation.html)

ct60

More efficient memory deallocation
 
Hello again,

I have code which involves many objects that have references to each other.

This causes large memory leaks since VBA is not able to deaalocate all
memory that has gone out of scope. So, I set all references, etc to NOTHING
when the objects terminate. Problem is there is still a significant memory
leak AND it is quite time consuming.

So does anyone know of a fast way to deallocate memory? The Unload
statement does not seemto help either.

What might be ideal is maybe a windows API function that deallocates memory.
In theory we should be able to point to an address in memory and a size of
the object structure and free that memory. Does anyone have know the details
of we can do something like that?

Any insights would be greatly appreciated.

Thanks,

Chris (ct60)

Tom Ogilvy

More efficient memory deallocation
 
VBA releases memory when it is appropriate. There are certainly bugs that
cause memory leaks, but I haven't heard of any associated with assigning
variables.

--
Regards,
Tom Ogilvy

"ct60" wrote in message
...
Hello again,

I have code which involves many objects that have references to each
other.

This causes large memory leaks since VBA is not able to deaalocate all
memory that has gone out of scope. So, I set all references, etc to
NOTHING
when the objects terminate. Problem is there is still a significant
memory
leak AND it is quite time consuming.

So does anyone know of a fast way to deallocate memory? The Unload
statement does not seemto help either.

What might be ideal is maybe a windows API function that deallocates
memory.
In theory we should be able to point to an address in memory and a size of
the object structure and free that memory. Does anyone have know the
details
of we can do something like that?

Any insights would be greatly appreciated.

Thanks,

Chris (ct60)




Peter T

More efficient memory deallocation
 
From what I've read, rather than what I know, the consensus seems to be it's
generally un-necessary to explicitly set object references to nothing just
before they would lose scope automatically, and might even do harm if done
in the wrong order. A strong and noteworthy opponent against is Matthew
Curland.

What seems more contentious though is the subject of "circular references",
even as to how the term is defined. From what you've described perhaps you
have those.

There has been a lot of discussion over the years in
microsoft.public.vb.general.discussion

Concerning API's you could look at HeapAlloc & HeapFree, though I doubt they
will help and I wouldn't touch them without fully understanding them.

I trust you are not using the End statement at all. Any automation, if so
are created objects closed/quit before any references to them are
destroyed..

Regards,
Peter T


"ct60" wrote in message
...
Hello again,

I have code which involves many objects that have references to each

other.

This causes large memory leaks since VBA is not able to deaalocate all
memory that has gone out of scope. So, I set all references, etc to

NOTHING
when the objects terminate. Problem is there is still a significant

memory
leak AND it is quite time consuming.

So does anyone know of a fast way to deallocate memory? The Unload
statement does not seemto help either.

What might be ideal is maybe a windows API function that deallocates

memory.
In theory we should be able to point to an address in memory and a size

of
the object structure and free that memory. Does anyone have know the

details
of we can do something like that?

Any insights would be greatly appreciated.

Thanks,

Chris (ct60)




ct60

More efficient memory deallocation
 
Thanks Guys -

I believe that this problem is fairly well documented.

If you have object A which has a ref to obj B which has a ref to obj C ( and
lets say that obj C also has a ref to obj B), when A goes out of scope - in
theory B and C should also. This does not happen. Watch in the memory usage
of excel in the task manager to see this effect.

Explicit use of the set obj=Nothing before terminating will resolve this
situation to a certain extent. Again, checking the memory usage for larger
programs will show clearly the memory deallocation. Out testing shows,
however, that there is still a fairly significant memory leak and the process
is time consuming.

One would expect that memory deallocation should be a very high speed
process. That being said, one of the advantages of using vba is that the
machine is smart enough to take on memory management issues rather than the
programmer.

And all this works ok until those rare time when we get into highly
sophisticated programs and want to have greater control over memory
management.

I am sure there are ways to get handles to objects in memory and dealloc
them in a high speed pprocess but it is surely a slippery slope. If this
problem is too pronounced then maybe we need lower level languages like C/C++
or perhaps C#.

Thanks again.

Chris

"Peter T" wrote:

From what I've read, rather than what I know, the consensus seems to be it's
generally un-necessary to explicitly set object references to nothing just
before they would lose scope automatically, and might even do harm if done
in the wrong order. A strong and noteworthy opponent against is Matthew
Curland.

What seems more contentious though is the subject of "circular references",
even as to how the term is defined. From what you've described perhaps you
have those.

There has been a lot of discussion over the years in
microsoft.public.vb.general.discussion

Concerning API's you could look at HeapAlloc & HeapFree, though I doubt they
will help and I wouldn't touch them without fully understanding them.

I trust you are not using the End statement at all. Any automation, if so
are created objects closed/quit before any references to them are
destroyed..

Regards,
Peter T


"ct60" wrote in message
...
Hello again,

I have code which involves many objects that have references to each

other.

This causes large memory leaks since VBA is not able to deaalocate all
memory that has gone out of scope. So, I set all references, etc to

NOTHING
when the objects terminate. Problem is there is still a significant

memory
leak AND it is quite time consuming.

So does anyone know of a fast way to deallocate memory? The Unload
statement does not seemto help either.

What might be ideal is maybe a windows API function that deallocates

memory.
In theory we should be able to point to an address in memory and a size

of
the object structure and free that memory. Does anyone have know the

details
of we can do something like that?

Any insights would be greatly appreciated.

Thanks,

Chris (ct60)





Peter T

More efficient memory deallocation
 
I believe that this problem is fairly well documented.

And highly debated!

In theory although memory may not be released when the reference goes out of
scope while the app is still running, when the code fully terminates VB(A)'s
garbage collection "should" restore. At least that's what some say.

A working example perhaps along the lines of what you describe is argued
here
http://tinyurl.com/vl624

(see thread view post 8 & on)

I suspect memory leak may also be caused by other things besides object
references.

Regards,
Peter T

http://tinyurl.com/vl624
"ct60" wrote in message
...
Thanks Guys -

I believe that this problem is fairly well documented.

If you have object A which has a ref to obj B which has a ref to obj C (

and
lets say that obj C also has a ref to obj B), when A goes out of scope -

in
theory B and C should also. This does not happen. Watch in the memory

usage
of excel in the task manager to see this effect.

Explicit use of the set obj=Nothing before terminating will resolve this
situation to a certain extent. Again, checking the memory usage for

larger
programs will show clearly the memory deallocation. Out testing shows,
however, that there is still a fairly significant memory leak and the

process
is time consuming.

One would expect that memory deallocation should be a very high speed
process. That being said, one of the advantages of using vba is that the
machine is smart enough to take on memory management issues rather than

the
programmer.

And all this works ok until those rare time when we get into highly
sophisticated programs and want to have greater control over memory
management.

I am sure there are ways to get handles to objects in memory and dealloc
them in a high speed pprocess but it is surely a slippery slope. If this
problem is too pronounced then maybe we need lower level languages like

C/C++
or perhaps C#.

Thanks again.

Chris

"Peter T" wrote:

From what I've read, rather than what I know, the consensus seems to be

it's
generally un-necessary to explicitly set object references to nothing

just
before they would lose scope automatically, and might even do harm if

done
in the wrong order. A strong and noteworthy opponent against is Matthew
Curland.

What seems more contentious though is the subject of "circular

references",
even as to how the term is defined. From what you've described perhaps

you
have those.

There has been a lot of discussion over the years in
microsoft.public.vb.general.discussion

Concerning API's you could look at HeapAlloc & HeapFree, though I doubt

they
will help and I wouldn't touch them without fully understanding them.

I trust you are not using the End statement at all. Any automation, if

so
are created objects closed/quit before any references to them are
destroyed..

Regards,
Peter T


"ct60" wrote in message
...
Hello again,

I have code which involves many objects that have references to each

other.

This causes large memory leaks since VBA is not able to deaalocate all
memory that has gone out of scope. So, I set all references, etc to

NOTHING
when the objects terminate. Problem is there is still a significant

memory
leak AND it is quite time consuming.

So does anyone know of a fast way to deallocate memory? The Unload
statement does not seemto help either.

What might be ideal is maybe a windows API function that deallocates

memory.
In theory we should be able to point to an address in memory and a

size
of
the object structure and free that memory. Does anyone have know the

details
of we can do something like that?

Any insights would be greatly appreciated.

Thanks,

Chris (ct60)








All times are GMT +1. The time now is 07:01 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com