Você limitou o tamanho do heap a 15 GB, mas a JVM está usando mais do que isso: pilha e memória nativa, algumas das quais são gerenciadas pela JVM (metaspace).
O comando pmap -x <pid>
pode ajudar a identificar onde os 2,5 GB extras são usados, pilha, heap.
O comando ps -o nlwp <pid>
fornecerá o número de encadeamentos. Cada thread está consumindo 1 MB de memória no seu caso, então mil threads usarão 1 GB.
O comando jstat -gc <pid>
mostrará o tamanho do metaspace usado na coluna MU.
Se a memória é usada pelo metaspace, você pode limitar seu uso usando esta opção:
-XX:MaxMetaspaceSize=1g