Weak reference for MapListeners?
I create objects which implement MapListener and then I register those objects with a CQC. If at some later time the only reference to that object is from the CQC, I would like that object to be garbage collected and the MapListener obviously unregistered. My understanding is that if I create objects and register them as MapListeners, they'll never be GC'd unless I unregister them. Is that right? For my application I'd like the CQC's reference to my MapListener to be a weak reference. Am I correct about all this? Can anyone suggest a work-around for me?
Thanks,
Andrew
Hi Andrew,
CQC (or any of the named cache implementations for that matter) isn't designed to treat listeners weakly, so there really is no clean way of doing what you are asking that I know of. The only thing I can think of is to wrap the other references to your listener object to incorporate a finalizer that will then turn around and unregister the "weak" listener, upon finalization.
For example:
import com.tangosol.net.NamedCache;
import com.tangosol.util.MapEvent;
import com.tangosol.util.MapListener;
import java.util.Iterator;
import java.util.HashSet;
import java.util.Set;
public class MyListener
implements MapListener
* The map listener object to wrap.
* @param listener the map listener
public MyListener(MapListener listener)
m_listenerInternal = listener;
* Register this listener with the specified cache.
* @param cache the named cache to register this listener with
public void registerWeakListener(NamedCache cache)
cache.addMapListener(getListenerInternal());
m_setCache.add(cache);
// ----- MapListener interface ----------------------------------------
* {@inheritDoc}
public void entryInserted(MapEvent evt)
getListenerInternal().entryInserted(evt);
* {@inheritDoc}
public void entryUpdated(MapEvent evt)
getListenerInternal().entryUpdated(evt);
* {@inheritDoc}
public void entryDeleted(MapEvent evt)
getListenerInternal().entryDeleted(evt);
// ----- internal -----------------------------------------------------
protected MapListener getListenerInternal()
return m_listenerInternal;
private MapListener m_listenerInternal;
private Object m_finalizer = new Object()
public void finalize()
MapListener listener = m_listenerInternal;
for (Iterator iter = m_setCache.iterator(); iter.hasNext(); )
((NamedCache) iter.next()).removeMapListener(listener);
private Set m_setCache = new HashSet();
}
Similar Messages
-
Hello,
UseWeakReference exists for addEventListener and for dictionaries. Is there any way to set a variable to be a weak reference? Kind of like WkPtr<> in boost for C++? I'd like to use this for function callbacks, amongst other things. Would hate to have to wrap everything in a dictionary as a hack.
Thanks!Alex,
Not quite what I was hoping for as an answer, but it's an answer nonetheless.
Thanks!
Mark -
Are weak references cleared with soft ones?
Suppose a program holds both weak and soft references to an object X. Suppose the virtual machine clears all the soft references at once, making X weakly reachable. Is the virtual machine guaranteed to clear all the weak references next before normal execution resumes?
I ask because I am setting up an automatic interning system for immutable objects of a certain class that will guarantee that at most one object of a given value is reachable by the rest of the program at one time but will allow objects to be garbage collected if necessary. I need to decide what reference object(s) to keep to each interned object. If I keep only a weak reference, objects will be discarded at the whim of the virtual machine; I would prefer to keep them around longer so they don't have to be recreated so many times. If I keep only a soft reference, I am concerned that another part of the program might keep a weak reference. If the answer to my question above is "no", the soft reference could be cleared and the interning system could create a second object with the same value while the first is still accessible via the weak reference. It seems safest to keep both a soft reference and a weak reference and only recreate the object if the weak reference has been cleared.Softs hang around until memory needs dictate theygo.
In my experience (Apple's 1.4 VM) this appears to be
as soon as GC is run, making them effectively
useless. Maybe VMs have improved.Not in my experience (Sun 1.4 VM). Soft references hang around forever. I had to stuff my class with bloat to make the instance larger, then change the VM heap size to get it to start collecting my soft references. Whereas the weak references are dumped ASAP. Inside scoop has it that finalizers will delay object collection a bit so be careful of that.
Also the only guarantee is that soft is cleared before weak when they refer to the same object. in my experience weak references go quickly. Like at the first GC when they are weak. You can not depend on any timing with respect to when the weak will be cleared. I don't think the spec even guarantees that soft will be enqueued before weak. Im not sure on that point. -
Soft/Weak References: rule of thumbs?
After reading <a target="extern" href="http://java.sun.com/developer/technicalArticles/ALT/RefObj/index.html">Reference Objects and Garbage Collection</a> i browsed my code and replaced my listener containers with versions that store WeakReference objects. The main idea is to avoid memory leaks by storing references to objects that are not needed anymore (the listener container is the only strong reference left).
Another rule is to use SoftReferences for caches. But I haven't figured out a good way of implementing it (for caches that fill itself with one single SQL statement).
Are there any other examples where it's good advice to use Soft/Weak References?For listeners, you have to make sure that the listener object is hard referenced - which is usually the case. After you release the listener object from the main application/object/thread, because it's finished or you don't need it anymore, the listener holder should not hold on to such references to avoid OutOfMemoryExceptions. Of course, the best way is always to unregister a listener, but unfortunately, we're not living in a perfect world. No listener is forced to unregister, they can simple forget to unregister. For this reason, it's better to tell the listener: if you register yourself, you should know that you are just referenced via WeakReferences. If the listener suddenly doesn't get listener events, this is a coding error which can be traced and fixed. But if a listener forgets to unregister itself, the resulting memory bloat is much harder to trace.
SQL table caches are difficult. On one hand you want to cache the data, on the other, you want to free this cache memory (temporarily) for more important memory usage. It's always a trade off between 2 advantages. If performance is not the big issue, but you get OutOfMemoryExceptions, then this is critical for the application to continue working. Better a little slower than not at all ... ;-) -
Cannot create weak reference to 'classobj' object
I am trying to run the python Script in a C# program using Iron Python I am getting this type of Error
cannot create weak reference to 'classobj' object
I am using this code for running the python code
var ironPythonRuntime = Python.CreateRuntime();
try
dynamic loadPython = ironPythonRuntime.UseFile("Program.py");
catch (Exception ex)
Console.WriteLine(ex.Message);Hi Mahesh,
About IronPython issue, It's third-party product. Please redirect to IronPython forum. The link as below.
https://ironpython.codeplex.com/workitem/list/basic
After search this error,
this thread tells me.
Try to use virtualenv. It is used to separate many instances of python and it's libraries - you can have as many virtual environments as possible: python 2.5 , 2.6 , 2.7, whatever - with any combinations of libraries - so you can have for example five
python 2.6 instances with different sets of libraries configured.
By the way, here is also a blog talking about
Running IronPython Scripts from a C# 4.0 Program
Now I will move your thread to "off-topic" forum. Thanks for your understanding.
Best regards,
Kristin
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click
HERE to participate the survey. -
Weak References in Listener Lists
I've found a common source of memory leaks is when objects that add themselves to listener lists forget to remove themselves when they are done.
It would be nice to generalize and say that listener lists should contain weak references, but there are probably valid cases where a listener's only valid reference is through the listener list.
It would be nice to extend the listener pattern so that the listener could specify if they should be referenced weakly, for examplemodel.addChangeListener(this, true)where true indicates the reference to the listener should be weak.
In some cases like the Model View Controller pattern, it probably makes sense that whenever a view listens to a model it should be weakly referenced. For example, when you construct a JTable and pass the model as a parameter to the constructor, the JTable should always specify a weak reference when it listens to the model.
I think supporting a feature like this in the listener APIs could help reduce the potential for memory leaks and make code a little more maintainable.There was another time that I dabbled in this idea.
But it always comes back to objects cleaning up
after themselves. Now if its not your code and you
cant ensure good behavior, then perhaps there is
cause. But I'd keep an assert and report the issue
if I saw it trigger.What would fire the assert? The Listener will never be garbage collected while it is listening to something. I assume that you are talking about when the listener is a Swing Object like a JFrame. I don't really like to use gui components as listeners.
If you have to write a clean up method, it kind of defeats the value of having automatic garbage collection to a degree. I like to be able to let my Objects just fall out of scope or just become unreachable when they are no longer needed without having to actively manage their deallocation. -
Garbage Collection Weak References
Can someone please explain to me the point of Weak References.
here is what i understand
// we have a strong reference object
String strong = new String("i am a strong reference");
// we create a weak reference object
Reference wr = new WeakReference(strong);
Now what i have understood from my readings is that now when strong dereferences the object that was initially created the garbage collector deallocates the memory for that item.
but what is the point of a WeakReference?This might be useful for you.
http://java.sun.com/developer/technicalArticles/ALT/RefObj/ -
I am attempting to upload a manually edited WADConfig xml to my VM. The WAD service is functioning correctly, I needed to add some custom WinEventLogs. The prescribed steps result in an error.
What am I overlooking?
I am following these instructions:
Step 5: Remotely install Diagnostics on your Azure Virtual Machine
azure.microsoft.com/en-in/documentation/articles/cloud-services-dotnet-diagnostics/#virtual-machine
$storage_name = "wadexamplevm"
$key = "<StorageAccountKey>"
$config_path="c:\users\<user>\documents\visual studio 2013\Projects\WadExampleVM\WadExampleVM\WadExample.xml"
$service_name="wadexamplevm"
$vm_name="WadExample"
$storageContext = New-AzureStorageContext
-StorageAccountName $storage_name -StorageAccountKey $key
$VM1 = Get-AzureVM
-ServiceName $service_name -Name $vm_name
$VM2 = Set-AzureVMDiagnosticsExtension
-DiagnosticsConfigurationPath $config_path
-Version "1.*"
-VM $VM1 -StorageContext $storageContext
$VM3 = Update-AzureVM
-ServiceName $service_name -Name $vm_name
-VM $VM2.VM
Unfortunately, I am receiving this error:
Update-AzureVM : BadRequest: Invalid update to extension reference for role: XXXXXX and reference: IaaSDiagnostics.
What's missing from the above script?Hi,
Since Azure SDK 2.5 uses the extension model the diagnostics extension, the configuration and the connection string to the diagnostic storage are no longer part of the deployment package and cscfg. All the diagnostics configuration is contained within the
wadcfgx. The advantage with this approach is that diagnostics agent and settings are decoupled from the project and can be dynamically enabled and updated even after your application is deployed.
Due to this change some existing workflows need to be rethought – instead of configuring the diagnostics as part of the application that gets deployed to each environment you can first deploy the application to the environment and then apply the diagnostics
configuration for it. When you publish the application from Visual Studio this process is done automatically for you. However if you were deploying your application outside of VS using PowerShell then you have to install the extension separately through
PowerShell.
There PowerShell cmdlets for managing the diagnostics extensions on a Cloud Service are -
Set-AzureServiceDiagnosticsExtension
Get-AzureServiceDiagnosticsExtension
Remove-AzureServiceDiagnosticsExtension
You can use the Set-AzureServiceDiagnosticsExtension method to enable diagnostics extension on a cloud service. One of the parameters on this cmdlet is the XML configuration file. This file is slightly different from the diagnostics.wadcfgx file. You can
create this file from scratch by either following the article that you are referring to or you can modify the wadcfgx file and pass in the modified file as a parameter to the powershell cmdlet.
To modify the wadcfgx file –
Make a copy the .wadcfgx.
Remove the following elements from the Copy:
<DiagnosticsConfiguration xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
<PrivateConfig xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
<StorageAccount name=" " endpoint="https://core.windows.net/" />
</PrivateConfig>
<IsEnabled>false</IsEnabled>
</DiagnosticsConfiguration>
Make sure the top of the file still has xml version and encoding –
<?xml version="1.0" encoding="utf-8"?>
Effectively you are stripping down the Wadcfgx to only contain the <PublicConfig> section and the <?xml> header. You can then call the PowerShell cmdlet along with the appropriate parameters for the staging slots and roles:
$storage_name = ‘
<storagename>’
$key= ‘<key>’
$service_name = '<servicename>'
$public_config = '<thepublicconfigfrom_diagnostics.wadcfgx>'
$storageContext = New-AzureStorageContext –StorageAccountName $storage_name –StorageAccountKey $key
Set-AzureServiceDiagnosticsExtension -StorageContext $storageContext -DiagnosticsConfigurationPath $public_config –ServiceName $service_name -Slot ‘Staging’ -Role ‘WebRole1’
Hope this helps !
Regards,
Sowmya -
Get Specific References for all Controls
Using slightly modified code from here, I am generating an array of all control references on my main front panel which is then passed through to a number of subVIs. Although this functionality does work, it would be preferable to get specific references to the controls (for example, Boolean RefNum instead of Control RefNum).
Getting these specific references seems possible using To More Specific Class and Class Specifier constants. However, data storage becomes an issue because I can no longer use arrays (as they are a different data type). I am not sure if there is another way to pass this data on. I have experimented casting the RefNums to Variants, but to get the data from the variant, I have to know what RefNum type I am expecting which sort of defeats the purpose of doing this in the first place.
A secondary problem is keeping the names of the references. The Control RefNums do not have names associated with them nor do I know how to assign names to them. I've again tried using variants and using the OpenG Set Data Name function, but this crashes LabVIEW without any indication of why.
I've attached a version of my code that tries assign names using OpenG Set Data Name and build a variant array. To run it, simple add the VI as a subVI to a VI that has some boolean controls on the Front Panel. Apologies for the rough state of the code - I'm still in the process of figuring out how to make it work so things are a bit messy.
Solved!
Go to Solution.
Attachments:
Get Specific Control Refs.vi 28 KBI don't know if you'll get much better. There is really no way I know of to have some fully flexible way of building named clusters of references based on any given front panel set you feed to it.
I tend to do things the manual way (as there are also a bunch of references to front panel elements I wouldn't need). I would do all the bundling work in a subVI.
I'm attaching a zip file that contains the key VI's (unless I missed something) on the first project where I really tried to abstract out the reference building. The files are LV9.
On my main VI, I have the subVI called Build UI References early in the VI during an initialization phase. I pass the reference to the main VI into that subVI that builds all the references. I worked it as a master cluster that contains elements that are arrays of references of related controls. It uses another subVI called Get References and Label Names that I created to help find controls. I still need to use More Specific Class to get the property references, but I don that only once at the beginning. I then pass that cluster wire out and to anywhere in my VI that would need access to the references for front panel elements.
I use arrays of strings to supply the names I need to build and bundle the references. This lets me ignore controls I don't care about. The disadvantages to my system is that if I change the name of any control, I need to update the name within this subVI. And if I want to add any controls, not only do I need to add the label names for the searching functions, I also need to update my typedef cluster (and you definitely want this to be a typedef) to add a spot to store the new reference.
I hope this gives you some ideas. It worked for me and I will likely use the scheme on another project (or even rewrite past projects using this scheme.) If there are any ideas for improvements, I'd be happy to hear them.
Attachments:
Build UI refs.zip 83 KB -
Getting Menu Reference for a VI other than the current one
Is there any way to get a Menu reference for a VI that isn't the current VI? There's Current VI's Menubar, but that only works on the current VI. I'd like something that does the same thing, but accepts a VI reference to a higher-level VI. I would expect to find a Property Node entry for it, but there doesn't seem to be one. This is for 8.2.
eaolson wrote:
A functional global is what I wound up using. It just seems odd to me that there's no other way to get access to that reference.
It also seems counter-intuitive to me that a Shortcut Menu reference is only valid inside that particular frame of the Event Structure that caught it. If you're using a producer-consumer architecture, you can not send that refnum off to the consumer loop for handling; it can only used within that frame of the Event Structure.
I am not sure what you mean. The refnum seems to be accessible from everywhere .
As i wrote above:
You can store the Menu Reference to a global variable for example, and you can read it, in any vi you want, just like all variables.
Note: Do not try to use a property note. Use the menu functions -
Open VI reference for VITs and VIs
Hi
I have a VIT and I get the reference using the Open VI reference. When I change (rename) this back to a VI, and get the reference for it, its much faster. Does the open VI reference takes longer for VITs than VIs in obtaining a reference?
Another question is the same VIT, takes lesser time to get the reference using the Open VI reference in LabVIEW 8.5.1. It takes longer in LV8.6. Why is this happening?
Thanks
Vaa San.The two main differences between a VI and a VIT are that VITs are never run, but are templates that generate a VI instance immediately that has all the properties, attributes and limitations of a VI. A VI on the other hand has only one instance (unless you make it reentrant)
· A VI generated by a VIT is debuggable just like a VI in that you can trace the execution along the wires. In general, a VIT creates a copy of the VI in memory when you open a reference to it. Creating that copy takes time, which affects performance when doing recursion. That copy is then a standard VI in every sense, except it is not a file. Also, if you don't close these references, they will take up space in your RAM. Reentrant VIs can currently only do real recursion in 8.5 and if they are part of a class. If you open a VIT, you don't open the actual file, but a clone. This way you can open it multiple times. Each time you open it, you get a clone. This is especially useful when you open the VIT with VI Server. VIT's are useful to make an interface window once, and use it multiple times in your program. If the code should run multiple times, but doesn't have a user interface, use reentrant VI’s instead. As far as having the project open, a VI will reload all instances related to the project therefore causing the Vi to load slower. Best Regards,
Juan Galindo
Applications Engineer
National Instruments -
Delivery without reference for stock transfer within the same plant 311
Dear all,
I need to create a delivery without reference for stock transfer within the same plant, movement 311, i.e. just from 1 storage location to another storage location.
I tried to use VL01NO with delivery type UL.
Now my question is how can I assign a receiving plant for a customer?
I can't do the MIGO or MB1B document because I need the delivery document (packing list, forms, Texts,...).
It's possible this option???
Thank you very much.Hi,
What is the item category you are assigning while doing VL01NO? Check the schedule line category for that item category assignment. That Schedule line category has an option for one step GI. There you can assign 311 or create a separate item category and schedule line category and in that SC assign 311.
Thanks
Krish. -
Tracking of Inbound Delivery reference for a Goods Receipt/GR line item
Hi,
We are posting goods receipt with reference Inbound delivery. We need to track Inbound delivery reference for a Goods Receipt/Goods Receipt line item.
Is it possible? What will be correct way to do this?
Regards,
MakarandHi Makarand ,
You may try with Table MKPF.
Goto SE16 and enter the above table to get the required data.
Regards
Ramesh Ch -
Where can I find the reference for modifying registry key for acrobat reader
I am a Web Developer and I need to limit the option the user may choose in acrobat reader plugin.
I doubt if there is option to configure in Windows Registry on HKCU\Software\Adobe\Acrobat Reader\9.0\PrefsDialog.
Anyone know where I can find the reference for those registry key?
I have downloaded sdk91_v2_win.zip file but I cannot find any reference.Refer to this:
Direct Download Links for Adobe Software
Mylenium -
I need a reference for the parameters in Firefox about:config.
I need a reference for the parameters in Firefox about:config.
I can't find it on the Web.*http://kb.mozillazine.org/about%3Aconfig_entries
*http://kb.mozillazine.org/Category:Preferences
There is also info in the Firefox preferences files (open via the location bar):
*resource:///defaults/pref/firefox.js
* resource:///greprefs.js
Maybe you are looking for
-
I was unable to purchase music as the billing address prompt was for the USA. As I am purchasing from England how do I overcome this? Is there a prompt to change the billing adress to GB and form $ to £.
-
BEx Analyzer bug in selection mask when selectin month values?
Hi Gurus, I´m working with NW BI 7.0 and using BEx Analyzer 7.X (based on 7.20, Support Package 5, Revision 1776). In a query I want to do a selection within a selection mask for the Cal/Month variable (0Calmonth InfoObject). The values for months ar
-
Hi All, I have a query regarding Adhoc Analysis in Smartview. In an Adhoc reports when I click on ZOOM IN or Double click on any of the parent in Account or Entity Dimesion the child is repeating or duplicates the number of times I use double click o
-
Hi all, Can any one explain me how can we assign target file system dynamically. Thanks in Advance Naveen
-
RBAC for deploy application to Collections
Hi, I want an Application admin not be able to deploy application to servers. I think I have to add all my target collection for User and Windows Workstation to the "Security Scope", and then have an security role that can deploy application to colle