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

  • Weak references for variables

    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/

  • Error while updating a custom Windows Azure Diagnostics configuration xml from powershell. "Invalid update to extension reference for role"

    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 KB

    I 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,
    Makarand

    Hi 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