JavaScript Caching – Adopting Perfect Caching for JS Apps

The Problem

JavaScript Single-Page-Applications tend to consist of a lot of JavaScript files. Several hundreds of JS files are no exception.

When accessing these applications using a web browser, every single JavaScript file has to be fetched using a distinct request. Unfortunately, browsers support only a limited number of parallel connections/requests. Older versions of Internet Explorer were limited to only two concurrent connections. Most modern browsers support six to eight concurrent connections, but this is still not enough to effectively fetch several hundreds of files.

Additionally, JS frontends these days can be several megabytes in size which need to be fetched from the server.
This results in wait times and high server load.

To reduce the wait time and server load, one could cache these files in the browser.

But how long should these files be cached?
And when they are cached and you deploy a new release of your application, users would have to delete their browser cache manually, which is not very practical.
Continue reading

Posted in Web as a Platform | Tagged , , , , | Leave a comment

Git Workflows Tutorial 3: Workflows in der Praxis

In den bisherigen Beiträgen wurden die Grundlagen zu Git Workflows definiert und anschließend einige Workflows betrachtet. Freilich nicht unerwähnt bleiben sollte die Tatsache, dass all die vorgestellten Mechanismen wie Code Review, Pull Request oder Merges von Werkzeugen unterstützt durchführbar sind. Dies soll Gegenstand dieses Beitrags sein.

Continue reading

Posted in Agile Methods and development, Atlassian Tools, Build, config and deploy | Tagged , , , | 1 Comment

Git Workflows Teil 2: Workflows meistern

Nachdem wir im vorigen einige Grundlagen zu Workflows und ein erstes Beispiel betrachtet haben, geht es nun ans Eingemachte. Wir vergleichen Workflows und machen uns Gedanken über den praktischen Einsatz von Workflows im alltäglichen Geschäftsbetrieb.

Continue reading

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

Git Workflows Teil 1: Warum wir Workflows brauchen

In dieser Artikelserie werden wir das in der Software-Entwicklung inzwischen omnipräsente Phänomen Git Workflows näher betrachten. Im ersten Teil betrachten wir das Wie und Warum hinter Git Workflows, bevor wir uns im zweiten Teil konkreten Workflow-Modellen widmen. Im dritten Teil beantworten wir die Frage, wie man eigene Workflows mithilfe von Werkzeugen geschickt umsetzt.

Ein typisches Szenario in einer Softwareschmiede könnte so aussehen: Eine gemeinsame Codebasis, mehrere Mitarbeiter oder sogar Teams und ein stabiler master-Zweig, von dem aus veröffentlicht werden soll. Ein “zweig-affines” Versionskontrollsystem soll her, denn Zweige gehören zum guten Ton – also setzt man auf Git. Warum eigentlich? Benutzt jeder heutzutage. Wie das im Detail funktioniert, ist ja auch nicht so wichtig.

Continue reading

Posted in Agile Methods and development, Build, config and deploy, Politics | Tagged , , | Leave a comment

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