String Deduplication zum Sparen von Speicherplatz in Java 8

Strings nehmen in den meisten Anwendungen den Großteil des Speicherplatzes ein. Wobei wir es hierbei nicht selten mit Duplikaten zu tun haben.
Häufiger Verursacher ist hierbei das Laden von Objekten aus externen Quellen wie Datenbanken oder das Parsen von externen String basierten Requests. Werden Entitäten in großen Mengen (z.B. Adressen) geladen,

public class Address {
   private String strasse;
   private String plz;
   private String ort;
   ...
}

so wird für jede Entitäten-Instanz Speicherplatz für die entsprechenden String-Instanz-Variablen reserviert. Am Beispiel von Adressen können wir uns gut vorstellen, dass hierbei die gleichen Ortsbezeichnungen wie “Hamburg” häufig in mehreren Adressinstanzen vorkommen und jeweils Speicherplatz zur Ablage des char-Arrays benötigt. Bei großen Datenverarbeitungen wird entsprechend viel Speicherplatz verwendet. Auch viele Leer-String Objekte können beobachtet werden.
Continue reading

Posted in Java Basics, Java Runtimes - VM, Appserver & Cloud | Tagged , , , | Leave a comment

Was bedeutet java.lang.OutOfMemoryError: GC overhead limit exceeded

OutOfMemoryError-Fehlermeldungen wie “Java heap space” und “PermGen space” sind den meisten Java-Programmierern ein Begriff. Auch im Operating sind diese beiden Meldungen häufig bekannt. Die Meldung “GC overhead limit exceeded” sieht man hingegen seltener und ist deswegen nicht immer ein Begriff.

Wird zu viel CPU Zeit für die Garbage Collection aufgewendet und es steht hierdurch zu wenig CPU Zeit für die Ausführung des eigentlichen Prozesses zu Verfügung, so tritt dieser Fehler auf. In der Default Einstellung der Oracle JVM bedeutet dies, dass 98% der CPU Zeit für die Garbage Collection aufgewendet wird, hierbei aber weniger als 2% des Heap Speichers freigeräumt werden konnte.
Die Prüfung soll verhindern, dass Anwendungen an diesem Limit nur noch extrem träge reagieren. Diese kann im Extremfall dazu führen, dass auch ein Abbrechen durch den Anwender kaum möglich ist.
Continue reading

Posted in Java Basics, Java Runtimes - VM, Appserver & Cloud | Tagged , , , | Leave a comment

Spring Loaded – Getting started

Mit Spring Loaded kann jeder den Class-Reload-Mechanismus aus Grails 2 in beliebigen Java-Projekt einsetzen. Der Einsatz von Spring ist dabei nicht zwingend erforderlich. Spring Loaded kann sehr schnell eingebunden werden und lässt sich zum Beispiel auch mit einem Tomcat aus Eclipse heraus verwenden. Dazu ist lediglich die Angabe zusätzlicher VM-Parameter notwendig:

-javaagent:path\to\lib\springloaded-x.x.x.RELEASE.jar -noverify

Wird eine Java-Anwendung mit diesen Parametern gestartet, werden in der laufenden Anwendung geänderte Class-Dateien automatisch ersetzt und der ansonsten häufig notwendige Neustart der Anwendung nach einer Änderung entfällt. Es dauert nur wenige Augenblicke bis die geänderte Klasse nach dem Speichern erkannt und anschließend ersetzt wird. Dies funktioniert sehr zuverlässig, solange die durchgeführten Änderungen von Spring Loaded unterstützt wird. Allerdings gibt es zahlreiche Einschränkungen, die durch diese Technologie nicht unterstützt werden. Nachfolgend ein kleiner Auszug dieser Einschränkungen:

  • Änderungen an der Klassenhierarchie
  • Hinzufügen von Dependencies in Spring-Beans (z.B. mit @Autowired)
  • Änderungen an JPA-Entitäten
  • Änderungen an Konfigurationsdateien (xml, properties, …)

Bei all diesen und vergleichbaren Änderungen ist weiterhin ein Neustart der Anwendung notwendig. Als Fazit kann somit festgehalten werden, dass Spring Loaded die Entwicklung an einigen Stellen deutlich schneller machen kann. Bei größeren Änderungen oder Änderungen über mehrere Anwendungsschichten hinweg kommt man aber nach wie vor meist nicht um einen Neustart der Anwendung herum.

Posted in Spring Universe | Tagged , , , | Leave a comment

Gradle 2.1 released with new plugin portal

Gradle 2.1 has been release recently. The biggest change is the addition of the new plugin portal. But there are far more interesting changes…

Continue reading

Posted in Build, config and deploy | Tagged , , , | Leave a comment

Spring Framework 4.1 GA released!

The newest version 4.1 of the Spring Framework has just being released. Here is a list of the main new features linked with the Spring blog post in which they are described in detail:

Posted in Spring Universe | Tagged , , , | Leave a comment

Avoid Multi Module Builds With Gradle

When splitting a project internally you typically use a multi module build. Build tools like Maven or Gradle have built-in support for this. For simple use cases this makes things much more complicated. By using Gradle this can also be done within one simple project. This post shows how you can accomplish this.

Continue reading

Posted in Build, config and deploy | Tagged , , | Leave a comment

Vaadin 7.3 Introduces New Valo Theme

A new minor release of the Vaadin Framework has been released. Besides a long list of bug fixes, there’s the one noteworthy and important new feature this version has to offer: the brand-new theme Valo.

The Valo theme

Valo, which is the Finnish word for light, is a fully customizable theme that consequently builds on the modular and configurable features of the SASS language. That is, you can fine-tune the general appearance of the theme (such as border roundness, colors, font types, bevels, shadows, etc.) just by tweaking the corresponding SASS variables. By that, you get a full-blown theme which supports a responsive design out of the box and which additionally lets you adapt the theme’s appearance to the specific needs of your own application. Have a look at the theme demo which lets you switch through different configurations of the same theme (note the theme switcher in the upper right corner of the demo).

Continue reading

Posted in Java Web Frameworks | Tagged , , , | Leave a comment