GarbageCollector Frage

Status
Nicht offen für weitere Antworten.
H

holdeFee

Gast
Hallo

Ich möchte innerhalb einer Schleife absolut sichergehen dass ein objekt welches = null gesetzt wurde sofort gelöscht wird und nicht nur die referenz gelöscht wird. ich habe versucht direkt nach dem = null setzen manuell mit System.gc() den garbage collector aufzurufen. Leider funktioniert das nicht. das objekt wird nicht immer sofort gelöscht. ich vermute dass die thread priority vom gc nicht hoch genug ist. Wie kann ich die hochsetzen? und wenn die überlegung schwachsinn ist, wie kann ich ein Objekt sofort sicher löschen?

mfg
 

Lim_Dul

Top Contributor
Garnicht.

Sowas geht nicht, die einzige Stelle, an der garantiert ist, dass das Objekt wirklich gelöscht wird, ist, wenn das Programm beendet wird. Und das reicht auch, man braucht eigentlich nie, dass das Objekt wirklich sofort gelöscht wird.

Warum willst du sowas überhaupt, da steckt höchstwahrscheinlich irgendwo ein Denk/Konzeptfehler drin.
 
H

holdeFee

Gast
Hallo und danke für die Anwort
Ich möchteb das machen, da ich in meiner Main Klasse eine run methode habe in der immer wenn ein bestimmtes ereignis eintritt ein objekt new Ereignis _ereignis erzeugt welches Canvas extendet und eine methode anbietet die ein animiertes gif zeichnet. wenn Ereignis != null ist wird die zeichnen Methode von Ereignis in der paint Methode der Main Klasse aufgerufen und das gif erscheint auf der zeichenflaeche. wenn das ereignis jetzt erneut eintritt wird _ereignis = null gesetzt (hier soll es gelöscht werden) und ein new Ereignis _ereignis erzeugt welches dann wieder neu gezeichnet wird. Leider ist es aber so dass bevor ein neues _ereignis erzeugt wird, das alte nicht gelöscht ist sondern nur null gesetzt wurde und nun kein wirklich neues Ereignis erzeugt wird sondern eine referenz auf das alte. im alten ereignis wurde ist das animierte gif natürlich schon beim letzten frame der animation angekommen und deshalb wird das neue ereignis nur als der letzte frame der animation angezeigt.

Ich hoffe das ich nicht allzu wirr geschrieben habe.

Danke und mfg
 
H

holdeFee

Gast
deine Antwort würde ich in die Kategorie "In Anbetracht der Differenz unserer Programmiererfahrung mit hoher Wahrscheinlichkeit wahre Aussagen" einordnen, aber wenn du anhand meiner Beschreibung diese Aussage treffen konntest, hast du evtl eine in der Beschreibung enthaltene mögliche Fehlerquelle entdeckt. Würde mir diese genannt, wäre mir sicherlich etwas geholfen!

Nicht böse gemeint, aber ich frage doch nicht wo der Fehler ist wenn ich wüsste wo der Fehler ist

mfg
 

AlArenal

Top Contributor
Habe ich auch nicht böse aufgenommen, aber so ganze ohne Sourcecode ist das ein Stochern im Nebel...

Mach dich doch mal nackig!
 
G

Gelöschtes Mitglied 6946

Gast
wenn du ein neues objekt erzeugst, dann hast du wirklich ein neues objekt - das alte ist weg (solang keine andere referenz darauf existiert). das neue objekt kann also nicht wirklich vom status des alten abhängen. in dem fall müsstest du die referenz vorher auch nicht auf null setzen. im zweifelsfall belies dich nochmal zum thema referenz und objekt :p
 

Lim_Dul

Top Contributor
Ein Objekt ist auch nur dann weg, wenn keine Referenz darauf mehr existiert.

Da das Canvas ja auch irgendwo zu sehen ist, wirst du das vermutlich irgendwo hinzufügen. Davon musst du es natürlich auch wieder entfernen.

Nur weil du an einer Stelle es auf null setzt ist es noch lange nicht woanders weg.
 
H

holdeFee

Gast
Alles klar, also

Code:
    public void run()
    {
        while(_verloren == false)
        { 
            if(_bildxposi > -6000)
            {
                _bildxposi--;
    
                {
                    
                }
            }
            
            repaint();
            
            
            for(int i=0; i<5; i++)
            {
                if(_schuesse[i] != null)
                {
                    _schuesse[i].schussBewegen();
                    if(_schuesse[i].gibxPosition() > _x_posi+400)
                    {
                        _schuesse[i] = null;
                    }
                    for(int j =0; j<4; j++)
                    {
                        if(_schuesse[i]!= null && _gegner[j] != null)
                        {
                            if((_schuesse[i].gibxPosition()  > _gegner[j].gibxPosition()-20) && (_schuesse[i].gibyPosition() > _gegner[j].gibyPosition()) && (_schuesse[i].gibyPosition() < _gegner[j].gibyPosition()+60))  
                            {
                                _letztegegnerxposi = _gegner[j].gibxPosition();
                                _letztegegneryposi = _gegner[j].gibyPosition();
                                _gegner[j] = null;
                                _schuesse[i] = null;
                                _explosion = null;
                                
                                Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
                                System.gc();
                                Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                                                                   
                                _explosion = new Explosion(_letztegegnerxposi,_letztegegneryposi);
                                            
                                _explo = 1;
                            }
                        }
                    }
                }
            }
            
            
            double zufallszahl = Math.random();
            if(zufallszahl < 0.009)
            {
                for(int i=0; i< 4; i++)
                {
                    if(_gegner[i] == null)
                    {
                        int zufallsstartposiy = (int)(Math.random()*200);
                        _gegner[i] = new Gegner(_x_posi+400,zufallsstartposiy);
                        break;
                    }
                }
            }
            for(int i=0; i<4; i++)
            {
                if(_gegner[i] != null)
                {
                    _gegner[i].gegnerBewegen();
                    if(_gegner[i].gibxPosition() < _x_posi+30)
                    {
                        _gegner[i] = null;
                        _schilde.schildVerlieren();
                        if(_schilde.gibAnzahlSchilde() == 0)
                        {
                            _healthpoint.healthpointVerlieren();
                        }
                        if(_healthpoint.gibAnzahl() <= 0)
                        {
                            _verloren = true;
                            repaint();
                        }
                    }
                }
            }
            
            try
            {
                Thread.currentThread().sleep(15);
            }
            catch(Exception ex)
            {}
        }
    }

so die kritische stelle ist die stelle an der halt new Explosion erzeugt wird
jetzt noch mit dem Versuch das ganze durch Prioritätsverteilung zu lösen.
in paint() steht nix relevantes ausser:

if(_explo = 1)
{
_explosion.zeichnen(g)
}


und in der Methode zeichnen von Explosion steht nur:

...
g.drawImage("explosion.gif",x,y,this);
...
 

Lim_Dul

Top Contributor
Code:
if(_explo = 1)
{
_explosion.zeichnen(g)
}
Wenn, sollte da _explo == 1 stehen.

Das eigentlich Problem ist aber (aus dem anderen Thread) vermutlich:
_explosion = Toolkit.getDefaultToolkit().getImage("blood.gif");

Ich weiß nicht, inwieweit java animierte Gifs verarbeiten kann. Da wird, wenn das Problem liegen.
 
H

holdeFee

Gast
korrekt, dir aber wohl auch nicht, oder deine Faulheit überwiegt gegenüber deiner Hilfsbereitschaft.
 
H

holdeFee

Gast
sorry das war nur ein schreibfehler, sollte == heißen.
und animierte gifs werden eigentlich richtig verarbeitet.
ich bin mir ziemlich sicher dass nur die referenz auf das alte objekt gesetzt wird, denn mit der manuellen einbindung des garbage collectors ist es schon "besser", d.h. es wird ungefähr jedes 3. mal wnen das ereignis eintritt neu und animiert gezeichnet.
deshalb dachte ich auch dass aufgrund irgendwelcher faktoren manchmal die thread priority vom gc niedriger ist
 

Yzebär

Bekanntes Mitglied
Lim_Dul hat gesagt.:
Ich weiß nicht, inwieweit java animierte Gifs verarbeiten kann. Da wird, wenn das Problem liegen.

Sehe ich genauso. Das Problem muß beim zeichnen liegen, mit rEferenzen auf ein altes Objekt hat das überhaupt nihcts zu tun und sowas geht auch gar nicht. Ein Objekt, das mit new erzeugt wurde, kann niemals eine Referenz auf ein verwaistes Objekt (also eines, das dem GC übergeben wurde) erhalten.
 

Lim_Dul

Top Contributor
Bitte was?

Ich habe keine Lust jetzt nachzuforschen, ob java mit animierten Gifs klarkommt.

Das ist ja wohl nicht meine Aufgabe. Und damit ist für mich der Thread hier jetzt beendet, so muss ich mich nicht anmachen lassen.

Faul ist hier nur der, der alles vorgekaut haben will!
 
H

holdeFee

Gast
das war nicht auf dich sondern auf den Gast bezogen, der nichts weiter geschrieben hat als dass mir die Sache wohl doch nicht so klar ist. Wenn DU der Gast warst, dann tut es mir natürlich leid, bin dir sehr dankbar dafür dass du mir hier versuchst zu helfen.
und ich wollte auch nicht dass du für mich nach zeichenmöglichkeiten für gifs guckst sondenr hab nur geschrieben dass ich das für unwahrscheinlich halte, weil die die anderen Objekte, z.b. _gegner das gif genauso laden und darstellen.

also sorry dass das hier alles flasch rübergekommen ist, danke dir und dem Yzebär,
ich mich dann nochmalmal nach den zeichenmöglichkeiten umsehen

mfg
 

Lim_Dul

Top Contributor
Ok, dann hab ich was mißverstanden ;)

Schwamm drüber.

Schau dir mal den Post über deinem an, da gehts um genau dein Problem
 
G

Gast

Gast
hab mich trotz Faulheit noch dazu durchgerungen ;-)
einen link zu posten...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
M GarbageCollector, Threads und Objekte zerstören? Allgemeine Java-Themen 3
G Referenz und Garbagecollector Allgemeine Java-Themen 4
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
G Polymorphie Programmdesign Frage Allgemeine Java-Themen 20
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5
M ArrayList<String> Frage Allgemeine Java-Themen 7
M OOP Design Frage Allgemeine Java-Themen 2
N Frage zur while-Schleife Allgemeine Java-Themen 18
T Best Practice Auslesen von Zeichenketten (Frage, Antworten, usw) Allgemeine Java-Themen 4
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
T Garbage Collection Frage Allgemeine Java-Themen 15
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
D Frage zu Java und Umlauten / charsets Allgemeine Java-Themen 2
B Frage zu Java und OpenGL? Allgemeine Java-Themen 3
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
A eine test thread.join() frage Allgemeine Java-Themen 2
DStrohma LayoutManager Frage zum GridBagLayout Allgemeine Java-Themen 4
F Frage zu Regex möglich Allgemeine Java-Themen 4
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Java Vector Frage Allgemeine Java-Themen 9
W Frage... Allgemeine Java-Themen 29
R Frage zur topologischen Sortierung Allgemeine Java-Themen 2
H Frage zu weka.core.Instance Allgemeine Java-Themen 3
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
T Frage zu Klassendesing Allgemeine Java-Themen 3
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
C Eclipse Wichtige frage Allgemeine Java-Themen 5
H Frage zu java.weka.core.Instances Allgemeine Java-Themen 3
S Frage zu Format Modifiers in Log4j Allgemeine Java-Themen 11

Ähnliche Java Themen


Oben