Speicherplatz ist immer ein Problem.
Aber das kann man nachmessen mit
http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
Ausreichend großes Array mit gewünschtem Typ erstellen, evtl. auch mal Befüllen.
Mit totalMemory() minus freeMemory() von Runtime den Speicherverbrauch berechnen und dann mal hier im Forum Werte posten.
Bit Array entspricht einem boolean-Array. Jedes Feld entweder True oder False wie bei einem Bit. Bitset ist wesentlich Speichersparender und das macht sich bemerkbar.
Solltest du auch mal Durchmessen.
Je weniger Speicher verbraucht wird, desto größer die Performance, da in weniger Schritten mehr Informationen in den Cache geladen und dort vorgehalten werden können.
Bezgl. Performance muss man zwischen AOT und JIT unterscheiden. AOT sorgt dafür dass die VM viel weniger zu tun hat was erstmal gut ist. JIT sorgt dafür, dass zur Laufzeit mit den zusätzlichen zur Laufzeit verfügbaren Informationen effizienter Maschinen-Code erstellt wird. Ersteres ist bei kleinen Programmen von Vorteil, die gestartet werden kurz durchrennen und ein Ergebnis liefern, letzteres zeigt seine stärken bei langlaufenden Berechnungen, Server-Anwendungen usw.
C ist eine Geschichte für puristen. Hier muss man wirklich wissen was man tut, wie man Speicher verwaltet und rein Prozedural zu Ergebnissen kommt.
C++ ist etwas unter dem jeder etwas anderes versteht und niemand weis wie man es nun zu verwenden hat. Es bietet mehr Möglichkeiten als C, bietet aber genauso die selben Möglichkeiten sich ins Bein zu schießen. Jede Software die ich in C++ bisher gebaut habe hat Compilezeiten jenseits von Gut und Böse. OpenCV z.B. halbe Stunde Desktop, 6 Raspi 2 oder Tage auf dem Raspi.
Den besten Kompromiss den ich zur Zeit gefunden habe ist Go. Schnelles Kompilieren, Cross-Kompilieren möglich, statisch gelinktes Binary mit einer Runtime, keine VM, daher schnell, denoch mit Speicherverwaltung und GC, sowie Interface-Konzept das Polymorphie ermöglicht.