Java startup parameters

The following Java startup parameters should be used (and the values adjusted) when running a Java process on a server.

-Xmx1G
-Xmx4G
-XX:+UseG1GC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:Gc.log
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M

When a Java process starts, it overwrites an existing GC log file. I would recommend to either use a timestamp in the filename or use the %pid placeholder.

If you want to use JMX, also add the following parameters:

-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=1888
-Dcom.sun.management.jmxremote.authenticate=false

Functional Interfaces in Java 8

With Java 8, the concept of Lambdas was finally added to the language specification. Often you’re using Lambdas on the fly without assigning them to a variable.

List<String> names = Arrays.asList("Arthur", "Marvin", "Zaphod");
names.stream().forEach(name -> System.out.println(name));

However if you want to save a Lambda into a variable and pass it as a method parameter or use it later, you need to pick the applicable type.

public static void main(String[] args) {
  List<String> names = Arrays.asList("Arthur", "Marvin", "Zaphod");
  Consumer<String> print = name -> System.out.println(name);
  applyToAllNames(names, print);
}

private static void applyToAllNames(List<String> names, Consumer<String> print) {
  names.stream().forEach(print);
}

Here is the list of the Interfaces you might use from the Java API:

  • Runnable // nothing
  • Supplier<T> // a return value
  • Consumer<T> // a parameter
  • BiConsumer<T, U> // two parameters
  • Function<T, R> // a parameter and a return value
  • BiFunction<T, U, R> // two parameters and a return value
  • UnaryOperator<T> // the parameter and the return value have the same type
  • BinaryOperator<T> // two parameters and a return value of the same type
  • Predicate<T> // a parameter and a boolean return value
  • BiPredicate<T, U> // two parameters and a boolean return value

InformIT presents all those Interfaces using a nice table in the article “Java SE 8 for the Really Impatient: Programming with Lambdas“.

 

Linux kills a process when when starving memory

I recently observed a rather strange problem with randomly dying Java processes under heavy load. The vital clue to this problem was hidden in /var/log/messages as shown below:

Feb 1 12:26:31 mysuperserver kernel: Out of memory: Kill process 30595 (java) score 252 or sacrifice child
Feb 1 12:26:31 mysuperserver kernel: Killed process 30595 (java) total-vm:13698324kB, anon-rss:8226564kB, file-rss:0kB, shmem-rss:0kB

It turns out that Linux may decide to kill a process when the system runs out of memory. It may make sense to cap the memory limit (-Xmx) of any Java processes running on the system to a value that sums up below the server’s available memory.

Jaan Angerpikk explained this problem in great detail, follow the link below to read more on this matter.

https://plumbr.eu/blog/memory-leaks/out-of-memory-kill-process-or-sacrifice-child

Memory stats on Linux

Did you ever wonder what the VIRT, RES and SHR memory figures in top on Linux are supposed to tell you?

Here we go:

  • VIRT – How much memory the process is able to access at the moment.
  • RES – How much memory the process is actually using at the moment. This is the value you should probably be looking at and corresponds with the %MEM column.
  • SHR – How much of the VIRT memory is shareable.

Continue here if you want more details:
http://mugurel.sumanariu.ro/linux/the-difference-among-virt-res-and-shr-in-top-output

A peek at the man page top might also help:

VIRT -- Virtual Memory Size (KiB)
 The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have
 been swapped out and pages that have been mapped but not used.

RES -- Resident Memory Size (KiB)
 The non-swapped physical memory a task is using.

SHR -- Shared Memory Size (KiB)
 The amount of shared memory available to a task, not all of which is typically resident. It simply reflects memory that
 could be potentially shared with other processes.

AdWords conversion tracking from AngularJS

Inspired by a blog post of Zain Zafar, I implemented my own version of a Google AdWords conversion tracking from AngularJS.

Load the AdWords code from your HTML file:

<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js"></script>

Then add the AdWords service to your Angular app:

angular.module('adWordsApp').factory('GoogleAdWordsService', function ($window) {
    return {
        sendBookingConversion: function (conversion_id, conversion_language, conversion_label, conversion_value, conversion_currency) {
        	var data = {
        			google_conversion_id: conversion_id,
        			google_conversion_language: conversion_language,
        			google_conversion_format: "3",
        			google_conversion_color: "ffffff",
        			google_conversion_label: conversion_label,
        			google_conversion_value: conversion_value,
        			google_conversion_currency: conversion_currency,
        			google_remarketing_only: false
        	};
        	//alert('call conversion: ' + JSON.stringify(data));
        	$window.google_trackConversion(data);
        }
    };
});

The last thing is to call the service from your controller when the conversion happens:

GoogleAdWordsService.sendBookingConversion(12345, 'de', 'TheLabel', 130, 'CHF');

 

Debug network traffic on a Linux server

Use the following shell command to print all traffic from and to the given IP:

/usr/sbin/tcpdump -n -i any host 10.254.52.59

This will print something like this:

15:46:29.272434 IP 10.254.52.59 > 10.254.252.237: ICMP echo request, id 1, seq 857, length 40
15:46:29.272469 IP 10.254.252.237 > 10.254.52.59: ICMP echo reply, id 1, seq 857, length 40
15:46:34.265170 IP 10.254.52.59 > 10.254.252.237: ICMP echo request, id 1, seq 858, length 40
15:46:34.265204 IP 10.254.252.237 > 10.254.52.59: ICMP echo reply, id 1, seq 858, length 40
15:46:39.265504 IP 10.254.52.59 > 10.254.252.237: ICMP echo request, id 1, seq 859, length 40
15:46:39.265539 IP 10.254.252.237 > 10.254.52.59: ICMP echo reply, id 1, seq 859, length 40

This can be quite handy if you need to debug network issues.