java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Allgemeine Java-Themen

Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 30.01.2006, 20:15   #1 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Standard Der Heap Space, ich weiß nicht mehr weiter!

Hallo liebes Forum!
Ich hatte sehr mühsam an einem Programm gearbeitet, dass auch Bilderdaten(von 3.75 MB) verabeiten muss. Anfangs hatte ich ein Java Heap Space Problem, da ich so dumm war und zum Verarbeiten. der Bilddaten String-Objekte benutzt haben. Dann musste ich von neuem beginnen und habe Performance-orientiert gearbeitet(also int-arrays) verwendet. Nun lässt sich aber wieder dieses Problem nicht vermeiden. Ich habe zwar meinen Heap Space auf bis zu 1024 MB reservieren lassen, aber das hilft nichts. Gab es da nicht einen Befehl, wo ich die ganzen nicht mehr verwendeten Objekte raushauen kann? Ich entsinne mich leider nicht, welcher das war.
Wisst ihr da was? Notfalls muss ich jemandem mein Programm schicken, damit er es sich mal anschaut. Ich probier nun erstmal aus den int-arrays byte-arrays zu machen, vielleicht bringt das noch was.

Vielen Dank für die Hilfe!
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 30.01.2006, 20:17   #2 (permalink)
Stammbenutzer
CD-R 74
 
Registriert seit: 28.11.2003
Fachbeiträge: 6.693
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Runtime#gc()

aber ich tippe mal auf nen programmierfehler. du hältst nicht zufällig alle bilddateien immer im speicher? 8) profile doch mal!
Roar ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 30.01.2006, 20:41   #3 (permalink)
Sky
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 30.08.2004
Fachbeiträge: 3.490
Abgegebene Danke: 1
Erhielt 4 Danke für 4 Beiträge
Zitat: Roar
Runtime#gc()
dürfte eigentlich nicht helfen...

@ Bebbo Erbse: Was genau machst Du mit deinen Bilddaten und wie viele Bilder der o.g. Größe werden verarbeitet ?
__________________
O u t O f M e m o r y
Schilder-Duke
Sky ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.01.2006, 13:26   #4 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Ich habs nun erstmal hinbekommen, dass es läuft. Die Performance passt zwar, aber das einzige Problem ist, dass es erst ab 512 MB RAM reicht...
Also mein Programm lädt die Bilddaten(z.b. 3,5Mb) in ein Array. An das Array kommt noch ein Feld dran, wo den Bilddaten Bitpositionen in einer Geheimdatei(die später in dem Bild versteckt wird) zugeordnet werden.
Das ganze kann man sich wie folgende Tabelle vorstellen:

int array[Bilddaten in Byte][zugeordnete Positionen][zugeordnete Positionen2]

Es können bis zu 8 zugeordnete Positionen hinzugefügt werden! Also reserviert er theoretisch, wenn die Bilddatei(BMP-Datei) 1024*768 Pixel(*3 Bildpunkte) erstmal 2359296 Felder(ohne die Null-Bytes der BMP-Datei). Ein Feld hält ja einen int wert, also wäre es 4 Byte groß. Das wären dann für die Bilddaten schon 4*2359296 = 9437184 Byte = 9 MB. Nun kommt ja noch mal so ein Feld mit den zugeordneten Positionen dazu, also wären das 9*(Anzahl von den Positionsfeldern, das sind maximal 8). Aber das sind dann doch auch nicht so viel MB, die benötigt werden...
Ich suche noch einen Befehl, mit dem ich eventuell nicht mehr verwendete Objekte(solche Felder) aus dem RAM rausholen kann.
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.01.2006, 14:00   #5 (permalink)
Benutzer
int
 
Registriert seit: 18.12.2005
Fachbeiträge: 34
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Moin Moin


Zitat: Bebbo Erbse
Ich suche noch einen Befehl, mit dem ich eventuell nicht mehr verwendete Objekte(solche Felder) aus dem RAM rausholen kann.
Den Garbage Collector kannst du mit
Code:
System.gc();
anwerfen. Nur ist dieses kein direkter Befehl sondern nur ein Hinweis an die VM. Die VM wird aktiv wenn sie Zeit und Lust hat.

Zu Beachten:
Der GC wirft nur die Objecte weg die keine Verbindung mehr zu aktiven Objecten haben.
Hab im letzen Jahr die selben Probleme gehabt und kann dir sagen =>
Code:
System.gc();
bringt nichts! Die VM wirft den GC an wenn sie es möchte/kann. Programmierung optimieren (Unter Forum Performance).

Und wirf mal einen Profiler an um zu sehen was wann erzeugt und wann es wieder gelöscht wird. Du hast sicherlich noch irgendwo eine Verbindung zu grade nicht benötigte Arrays. Mußt du immer alle Array im Ram haben?

cu Ontos
Ontos ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 31.01.2006, 17:53   #6 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Hm... Danke für den Tipp! Das mit dem " System.gc(); " hatte ich auch schonmal probiert(nur hab ich diese Anweisung vergessen) und damals hats auch nichts gebracht.
Also eigendlich brauche ich nicht alle, ich weiß aber nicht, welche Objekte noch als aktiv gelten. Ich kann ja mal einen Ausschnitt meines Programms posten:

Code:
// Klasse distributor.java

	public static int[][] lead(int[] buffer) {
		int[][] stegamap;
		datastop = (7*8) + (datalength%CBMP.bitperbyte) + ((datalength-(datalength%CBMP.bitperbyte))/CBMP.bitperbyte);    // Kann ignoriert werden
		stegamap = distribute(buffer);     // Achtung: Diese distribute-Methode ist eine andere, als die, die im folgenden gemeint ist. 
                                                                 //Der Schritt tut also kaum was zur Sache, er setzt lediglich die erste Datenbitpositionenreihe an stegamap
		for(int i = 1; i < CBMP.bitperbyte; i++) {
			fields = i+1;
			datastart = datastop;  // kann auch ignoriert werden
			datastop += (datalength-(datalength%CBMP.bitperbyte))/CBMP.bitperbyte;  // kann auch ignoriert werden
			stegamap = distribute(stegamap);
		}
		return stegamap;
	}

// Also, zur Erklärung:
//Diese Methode fordert die Bilddaten als int-array(buffer[]). Zurückgegeben wird das zweidimensionale Array stegamap, wobei man sich das wie oben vorstellen kann(sodass 
//den Bilddaten noch bestimmte Positionen von Datenbits zugeordnet sind). Die Methode distribute erweitert dieses Feld um eine Dimension, um noch eine Reihe von 
//zugeordneten Datenbitpositionen hinzuzufügen und diese Positionen dann zuzuweisen:

	public static int[][] distribute(int[][] stegamap) {
		
		int[][] expanded_stegamap = new int[bufferlength][fields+1];    // Hier wird eben eine Reihe hinzugefügt
		
		
		for(int fieldnumber=0; fieldnumber<fields; fieldnumber++) {    // Hier wird das übergebene Array mit der expanded_stegamap erstmal gleichgesetzt(werte werden übertragen)
			for(int pointer=0; pointer < bufferlength; pointer++) {
				expanded_stegamap[pointer][fieldnumber] = stegamap[pointer][fieldnumber];
			}
		}
		for(int i = 0; i < bufferlength; i++) {   // Hier wird die extraspalte mit -1 gefüllt
			expanded_stegamap[i][fields] = -1;
		}

// Die methode geht dann weiter
		return expanded_stegamap;
	}
Nun nochmal ein Beispiel.
Ich habe erst das Array Buffer[] mit den Bilddaten.
Danach ein erstes Array Stegamap, was so aussieht: stegamap[Bilddaten][Datenbitpositionen]. Nach unten hin verlaufen eben wie in einer Tabelle die Daten. Dann soll eben noch eine Reihe hinzugefügt werden, sodass das dann so aussieht: stegamap[Bilddaten][Datenbitpositionen][Datenbitpositionen2]
Bis zu 8 werden maximal hinzugefügt. Das hinzufügen und zuweisen der Datenbitpositionen geschieht über die methode distribute. Wie das geschieht ist hier eigendlich egal. Ich denke, dass das wesentliche Problem im geposteten Code ist.

Ich bin leider gezwungen int-Arrays zu benutzen, weil die zugeordneten Datenbitpositionen höhere Werte erreichen können...
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 08:38   #7 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 24.11.2005
Fachbeiträge: 3.182
Abgegebene Danke: 7
Erhielt 89 Danke für 89 Beiträge
Wenn Du das Programm startest, setzt Du dann mir der "-Xmx"-Option die maximalen Heap-Größe?
Hintergrund der Frage ist, dass nach meiner Erfahrung der Garbage-Collector erst dann anspringt, wenn man sich
wirklich hart an der Grenze des verfügbaren Speichers bewegt. Wenn man sich also mit -Xmx eine grossen
Speicherbereich "zur Sicherheit" reservieren will, dann muss man damit rechnen, dass dieser Speicher auch belegt wird.
Murray ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 08:56   #8 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.637
Abgegebene Danke: 0
Erhielt 2.565 Danke für 2.526 Beiträge
falls sich jemand wundert warum das ganze unlesbar ist
-> zu langer Kommentar im Codeteil, bitte Zeilenumbrüche einfügen..
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 13:24   #9 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Tut mir Leid! Ich kann den Kommentar nun icht mehr kürzen.
Ja, ich setze die maximale Heap-Größe. Aber, dass 256 MB nicht mehr ausreichen, kann ich mir einfach nicht vorstellen. Jemand mit 256 MB RAM wäre also nicht im Stande das Programm zum Laufen zu bringen. Gibt es denn an den Codestellen noch irgendwas Performancemäßig zu verbessern? Ich bin mit ziemlich sicher, dass es an der Stelle liegt, da dort mit 256 MB Heap Size bereits eine Fehlermeldung kommt...
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 13:35   #10 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 24.11.2005
Fachbeiträge: 3.182
Abgegebene Danke: 7
Erhielt 89 Danke für 89 Beiträge
Bei 256 MB bekommst Du einen OutOfMemoryError? Dann wird wirklich soviel Speicher verbraucht.
Ich dachte, Du wunderst Dich nur über den Speicherverbrauch. In solchen Fällen kann es wirklich so
sein, dass ein an sich korrektes Programm sich fast den gesamten mit -Xmx definierten Speicher greift,
bevor der GC eingreift - bevor es zu einer Exception kommt, wird dann aber auf jeden Fall collected.
Murray ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 13:36   #11 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Benutzerbild von Bleiglanz
 
Registriert seit: 06.09.2004
Fachbeiträge: 5.829
Abgegebene Danke: 12
Erhielt 107 Danke für 87 Beiträge
also wenn ich Stegeanographie machen müsste

dann würde ich das bild laden

eventuell in Rot-Grün-Blau zerlegen

das Geheimnis "in einem Durchlauf" in die niederwertigen bits hineinmischen

fertig

was soll das getue mit
Code:
tegamap[Bilddaten][Datenbitpositionen].
wozu muss so ein Array überhaupt erzeugt werden?
__________________
If you have nothing bad to say, say nothing.
Bleiglanz ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 14:59   #12 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Nunja, da steckt natürlich schon eine Funktion dahinter:
Die Bits werden nicht einfach hintereinander reinversteckt. Erst werden die Bits der Datendatei durcheinandergewürfelt und irgendwo in den Bilddaten verteilt. Die Positionen sind dabei abhängig vom eingegebenem Passwort. Dabei muss ich ja zum einen festhalten, um welches Datenbit es sich handelt(Also die Bitnummer von der ganzen Datendatei) und wo sie im Bild versteckt wird. Und dazu brauch ich halt das Feld...
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 15:26   #13 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Benutzerbild von Bleiglanz
 
Registriert seit: 06.09.2004
Fachbeiträge: 5.829
Abgegebene Danke: 12
Erhielt 107 Danke für 87 Beiträge
ist doch quark, wenn du ein passwort hast dann verschlüssle eben mit AES oder DESEDE, dann wird mehr oder weniger ein Zufallsstrom hineingemischt


Tipp:

byte[A][B]

benötigt Speicher in der Grössenordnung A*B


Code:
      for(int i = 1; i < CBMP.bitperbyte; i++) {
         fields = i+1;
         datastart = datastop;  // kann auch ignoriert werden
         datastop += (datalength-(datalength%CBMP.bitperbyte))/CBMP.bitperbyte;  // kann auch ignoriert werden
         stegamap = distribute(stegamap); // WAHNSINN
         // IN JEDEM SCHLEIFENDURCHLAUF
         // RIESIGE ARRAYS ERZEUGEN
      }
__________________
If you have nothing bad to say, say nothing.
Bleiglanz ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 01.02.2006, 17:47   #14 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Nunja, es soll für Außenstehende aber schwieriger sein überhaupt zu erkennen, dass dort eine Versteckte Nachricht vorliegt... Und das mit dem byte[]-Array geht leider nicht. Daran hatte ich auch schon gedacht, aber das ganze sähe ja dann so aus:

stegamap[Bilddaten][Bitpositionen]

Die Bilddaten können als byte-Wert genommen werden, aber die Bitpositionen erreichen durchaus sehr hohe Werte, wofür ich wiederum einen Integer-Type benötige... Ich glaube für dieses Problem gibt es keine richtige Lösung...
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 02.02.2006, 07:25   #15 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Benutzerbild von Bleiglanz
 
Registriert seit: 06.09.2004
Fachbeiträge: 5.829
Abgegebene Danke: 12
Erhielt 107 Danke für 87 Beiträge
Zitat:
Nunja, es soll für Außenstehende aber schwieriger sein überhaupt zu erkennen, dass dort eine Versteckte Nachricht vorliegt.
deshalb verschlüssle mit AES oder einer anderen symmetrischen Chiffre, es entsteht ein byte-Array das "praktisch" wie ein Zufallsstrom von Bytes aussieht

=> wenn du dieses direkt z.B. in das niegrigste Bit von "Rot" einmischt, dann wäre es schon sehr schwer, dieses "Rauschen" als Nachricht zu erkennen

kannst du mal erklären wie das mit den "Bitpositionen" genau funktionieren soll?
__________________
If you have nothing bad to say, say nothing.
Bleiglanz ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 02.02.2006, 13:58   #16 (permalink)
Bebbo Erbse
Nicht angemeldet
 
Fachbeiträge: n/a
Hallo, das mit dem AES klingt sehr interessant, das könnte ich zur zusätzlichen Verschlüsselung noch nehmen!
Gibt es dafür schon vordefinierte Java-Klassen? Und welche sind das?

Also das Vermischen der Datenbits im Bild soll ja nicht mit der Verschlüsslung gleichgesetzt werden.
Es wird lediglich die Nachricht nochmal im Bild verteilt, statt in jedem Rot-Anteil hintereinander etwas zu verstecken.

Hier mal Ein Beispiel:

Ich nehme den Buchstaben "A" als Geheimtext.
Jetzt zerlege ich den Buchstaben in seine Bits(nach dem ASCII Code).
Also... A = 65 = 01000001(bit)

Ich denke mir jetzt folgende Tabelle:

Bitpositionen: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
------------------------------------------------
Bits_______: 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |


Jetzt habe z.b. folgende Bilddaten in das Array geladen(Jeden Rot- Grün- oder Blau-Anteil hintereinander):

________(_R__G__B_|_R___G__B_|_R__G___B_|_R_|_G_|_B_)
Bilddaten: FF | FF | FF | 00 | 00 | 00 | FF | FF | FF | 00 | 00 | 00 |

Das R/G/B obendrüber kommt natürlich nicht in die Tabelle.
Es soll jetzt nur als Veranschaulichung dienen. Aslo, mein Bild hat nun 4 Pixel(abwechselnd weiß/schwarz).

Jetzt kommt die distributor-methode ins Spiel. Sie nimmt sich jetzt die Bilddaten und fügt noch eine Zeile
mit den zugeordneten Bitpositionen hinzu. In diesem Beispiel verstecke ich nur ein Bit in einem Byte, sodass
ich nur eine Zeile hinzufügen muss:

Bilddaten___: FF | FF | FF | 00 | 00 | 00 | FF | FF | FF | 00 | 00 | 00 |
----------------------------------------------------------------------------------|
Bitpositionen: 07 |02 |--- |04 | --- | --- | --- | 06 |03 | 01 | 05 | 00 |


Jetzt wird das diesem Farbanteil also sozusagen ein Bit zugewiesen, was in dem Array durch die Position des Bits
im Gesamtgeheimtext dargestellt wird.


Also werden in die Bilddaten wie folgt verändert:

Farbanteil --> Verstecktes Bit(Position des Bits im Geheimtext) --> Resultierender Farbanteil mit verstecktem Bit

FF --> 1(07) --> FF
FF --> 0(02) --> FE
FF --> keins --> FF
--
00 --> 0(04) --> 00
00 --> keins --> 00
00 --> keins --> 00
--
FF --> keins --> FF
FF --> 0(06) --> FE
FF --> 0(03) --> FE
--
00 --> 1(01) --> 01
00 --> 0(05) --> 00
00 --> 0(00) --> 00

Ich hab die Bilddaten jetzt mal zur Übersicht von oben nach unten gelistet.
Achso, der Geheimtext "A" kann natürlich schon bevor er in seine bits zerlegt wird, verschlüsselt werden.
Die Positionszuweisung bei der distributor-methode geschieht unterschiedlich, je nach eingegebenem Passwort. Demnach ist beim Extrahieren der Nachricht aus einem Bild auch das richtige Passwort notwendig, um die Positionen des der Farbanteile und die Reihenfolge der Bits herauszubekommen.

Ich gebe zu das ganze ist etwas verwirrend und ich hoffe, dass hier ohne Fehler dargestellt zu haben.
Würde man 2 Nachrichtenbits in einem Byte verstecken, dann müsste man oben nur eine weitere Zeile
mit Bitpositionen hinzufügen...[/u]
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SWT Neuling weiß nicht weiter DerGrinch AWT, Swing, JavaFX & SWT 2 25.11.2008 20:42
ich weiß nicht weiter. Nucho Java Basics - Anfänger-Themen 13 20.08.2007 19:05
Weiß nicht weiter! X-Treme Java Basics - Anfänger-Themen 73 20.11.2006 07:59
Weiß nicht mehr weiter! Bitte helft mir! Interessierte Allgemeine Java-Themen 5 09.10.2006 19:13
Bin fertig und weis nicht weiter biohuman Für Verirrte - Fragen zu JavaScript 0 27.09.2006 03:26


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de