Java-geheugengebruik - is deze syntaxis correct of veroorzaakt deze een geheugenlek?

HashMap obj = new HashMap();
for(int i=0;i<1000;i++) {
    obj = getObjects(i);
}

Zal deze code een geheugenlek veroorzaken op deze regel "obj = getObjects (i);"?

Ik weet niet zeker of de oude waarden van obj zijn vrijgegeven of dat ze nog steeds het geheugen gebruiken.

Als dit een geheugenlek is, wat is dan de juiste syntaxis?

2
De HashMap waar obj naar wees vóór de opdracht zou garbage verzameld krijgen, omdat er geen verwijzingen naar zullen zijn, maar er is geen garantie dat dit zal gebeuren zodra de opdracht is voltooid. Garbage collection zal uiteindelijk gebeuren.
toegevoegd de auteur Madhusudhan, de bron
Gebruik geen onbewerkte typen zoals HashMap.
toegevoegd de auteur Madhusudhan, de bron

7 antwoord

In Java is er een garbage collector, dus bij normale operaties als deze is het vrij moeilijk om een ​​geheugenlek te veroorzaken. De vuilnisman gaat rond en bevrijdt elk geheugen waarnaar niet meer wordt verwezen.

More info on garbage collection: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Het korte antwoord is dat uw code geen geheugenlek mag veroorzaken.

1
toegevoegd

In Java is er een garbage collector, dus bij normale operaties als deze is het vrij moeilijk om een ​​geheugenlek te veroorzaken. De vuilnisman gaat rond en bevrijdt elk geheugen waarnaar niet meer wordt verwezen.

More info on garbage collection: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Het korte antwoord is dat uw code geen geheugenlek mag veroorzaken.

1
toegevoegd

Zal deze code een geheugenlek veroorzaken op deze regel "obj = getObjects (i);"?

Het is onmogelijk om het zeker te zeggen. U hebt ons de code voor getObjects niet getoond en het is mogelijk (hoewel niet waarschijnlijk, gebaseerd op de naam van de methode) dat die methode een intern geheugenlek zou kunnen hebben.

Het herhaaldelijk toewijzen van verwijzingen naar een eenvoudige variabele (bijvoorbeeld obj ) zal echter geen geheugen lekken.

Ik weet niet zeker of de oude waarden van obj zijn vrijgegeven of dat ze nog steeds het geheugen gebruiken.

Het is niet zo eenvoudig:

  • From a storage management perspective, the "old values of obj" are references ... not objects.
  • The objects that those references refer to will not be released immediately when you assign a different reference to obj.
  • They will eventually be released in the future by the GC, provided that:
    • there is sufficient memory pressure to cause the GC to run for the "space" where the objects have been allocated, and
    • nothing else references the objects.

Als dit een geheugenlek is, wat is dan de juiste syntaxis?

Voor de goede orde, geheugenlekken zijn geen syntaxis.

0
toegevoegd

Zal deze code een geheugenlek veroorzaken op deze regel "obj = getObjects (i);"?

Het is onmogelijk om het zeker te zeggen. U hebt ons de code voor getObjects niet getoond en het is mogelijk (hoewel niet waarschijnlijk, gebaseerd op de naam van de methode) dat die methode een intern geheugenlek zou kunnen hebben.

Het herhaaldelijk toewijzen van verwijzingen naar een eenvoudige variabele (bijvoorbeeld obj ) zal echter geen geheugen lekken.

Ik weet niet zeker of de oude waarden van obj zijn vrijgegeven of dat ze nog steeds het geheugen gebruiken.

Het is niet zo eenvoudig:

  • From a storage management perspective, the "old values of obj" are references ... not objects.
  • The objects that those references refer to will not be released immediately when you assign a different reference to obj.
  • They will eventually be released in the future by the GC, provided that:
    • there is sufficient memory pressure to cause the GC to run for the "space" where the objects have been allocated, and
    • nothing else references the objects.

Als dit een geheugenlek is, wat is dan de juiste syntaxis?

Voor de goede orde, geheugenlekken zijn geen syntaxis.

0
toegevoegd

Een referentie of object wordt niet "vrijgegeven" wanneer het wordt overschreven. Er is geen werk meer om een ​​referentie toe te wijzen als het toewijzen van een int aan een variabele.

In plaats daarvan bestaat de oude verwijzing simpelweg niet meer en GC zoekt naar verwijzingen die nog steeds bestaan.

0
toegevoegd

Ik heb een test gedaan en het gaat goed, java publiceert periodiek geheugen. Ik heb HashMap nog steeds gebruikt om mijn toepassingscontext te reproduceren.

package memtest;

import java.util.HashMap;

public class MemTest {
    public static void main(String[] args) throws InterruptedException {
        HashMap obj = new HashMap();
        int loop = 1;
        while(true) {
            HashMap newObj = new HashMap();
            newObj.put("1", "big string that is not pasted here");
            obj = newObj;
            System.err.println("At loop "+loop);
            Thread.sleep(1000);
            loop++;
        }
    }    
}
0
toegevoegd

Ik heb een test gedaan en het gaat goed, java publiceert periodiek geheugen. Ik heb HashMap nog steeds gebruikt om mijn toepassingscontext te reproduceren.

package memtest;

import java.util.HashMap;

public class MemTest {
    public static void main(String[] args) throws InterruptedException {
        HashMap obj = new HashMap();
        int loop = 1;
        while(true) {
            HashMap newObj = new HashMap();
            newObj.put("1", "big string that is not pasted here");
            obj = newObj;
            System.err.println("At loop "+loop);
            Thread.sleep(1000);
            loop++;
        }
    }    
}
0
toegevoegd