397 liens privés
TL;DR: The JVM by default exports statistics by mmap-ing a file in /tmp (hsperfdata). On Linux, modifying a memory mapped file can block until disk I/O completes, which can be hundreds of milliseconds. Since the JVM modifies these statistics during garbage collection and safepoints, this causes pauses that are hundreds of milliseconds long. To reduce worst-case pause latencies, add the -XX:+PerfDisableSharedMem JVM flag to disable this feature. This will break tools that read this file, like jstat.
Bien penser à limiter et dimensionner le ramdisk en proportion de la ram.
Explication des éléments phases, goals, executions dont on a besoin pour configurer des plugins maven.
Et la lumière fut.
"""
- Don’t hotdeploy/redeploy/migrate your java services in production at runtime
- Do have a very strong focus on your delivery pipeline/automation/testing to quickly make changes to your system
"""
Autre lecture conseillée: https://medium.com/fabric8-io/the-decline-of-java-application-servers-when-using-docker-containers-edbe032e1f30
Petite formule saltstack pour faire utiliser les 3/4 de la RAM à la JVM:
"""
Xmx: {{ (((grains.mem_total|int) 3) / 4)|round|int }}M
Xms: {{ (((grains.mem_total|int) 3) / 4)|round|int }}M
"""
J'ai positionné cela dans les pillars.
C'est inspiré de https://mywushublog.com/2013/09/postgresql-salt-state/ (https://jeekajoo.eu/links/?crzrTg)
Cela évite d'avoir à se palucher un tuning manuel pour des machines dont les capacités mémoire sont différentes. Exemple sur ec2:
- m3.2xlarge = 30 G
- c3.2xlarge = 15 G
- c3.xlarge = 7.5 G
- m3.medium = 3.75 G
- ....
"""
So does that mean Java application servers are dead? In a docker world there’s really no need to ever hot deploy java code into a running java process in production any more. However that can be useful in development; being able to hot deploy code into a running instance. (Though to be fair you can do the same thing in any Java application with tools like JRebel; most IDE debuggers do the same trick too).
So I’d say that Java Application Servers are mutating into becoming more like frameworks that are baked into an immutable image that are then managed externally by the cloud (e.g. via kubernetes). In many ways the cloud (e.g. kubernetes and docker) takes over many of the features that Java application servers used to do; since rolling upgrades of new images is needed for all technologies (java/golang/nodejs/python/ruby et al).
"""
via https://julien.mailleret.fr/links/?D0Ck6w
pour faire des interfaces de backoffice de manière plus simple et standardisée
Pour la partie serveur, j'utilise jolokia dont le jar est chargé en tant qu'agent de la jvm, de cette façon:
-javaagent:/var/lib/tomcat8/lib/jolokia-jvm-agent.jar=port=7777,host=localhost,agentContext=/jolokia
Pour la partie cliente, j'utilise la lib python 'pyjolokia': https://github.com/cwood/pyjolokia . Ce client me permet de faire un monitoring de la JVM en python. Ce qui est appréciable.
Voici ma méthode pour lister les mbeans, en mode intéractif via une console python:
initialisation
from pyjolokia import Jolokia
j4p = Jolokia('http://localhost:7777/jolokia/')
lister les mbeans dans java.lang:*
j4p.request(type = 'search', mbean='java.lang:')
{u'status': 200, u'timestamp': 1429886584, u'request': {u'type': u'search', u'mbean': u'java.lang:'}, u'value': [u'java.lang:name=Metaspace,type=MemoryPool', u'java.lang:type=Runtime', u'java.lang:type=Threading', u'java.lang:type=OperatingSystem', u'java.lang:name=Code Cache,type=MemoryPool', u'java.lang:type=Compilation', u'java.lang:name=G1 Young Generation,type=GarbageCollector', u'java.lang:name=CodeCacheManager,type=MemoryManager', u'java.lang:name=Compressed Class Space,type=MemoryPool', u'java.lang:type=Memory', u'java.lang:name=G1 Eden Space,type=MemoryPool', u'java.lang:name=G1 Old Gen,type=MemoryPool', u'java.lang:name=G1 Old Generation,type=GarbageCollector', u'java.lang:type=ClassLoading', u'java.lang:name=Metaspace Manager,type=MemoryManager', u'java.lang:name=G1 Survivor Space,type=MemoryPool']}
lister les attributs d'un mbean en particulier, par exemple java.lang:name=G1 Old Generation,type=GarbageCollector
j4p.request(type = 'list', path='java.lang/type=GarbageCollector,name=G1 Old Generation')
{u'status': 200, u'timestamp': 1429886821, u'request': {u'path': u'java.lang/type=GarbageCollector,name=G1 Old Generation', u'type': u'list'}, u'value': {u'attr': {u'CollectionTime': {u'rw': False, u'type': u'long', u'desc': u'CollectionTime'}, u'LastGcInfo': {u'rw': False, u'type': u'javax.management.openmbean.CompositeData', u'desc': u'LastGcInfo'}, u'Name': {u'rw': False, u'type': u'java.lang.String', u'desc': u'Name'}, u'ObjectName': {u'rw': False, u'type': u'javax.management.ObjectName', u'desc': u'ObjectName'}, u'Valid': {u'rw': False, u'type': u'boolean', u'desc': u'Valid'}, u'MemoryPoolNames': {u'rw': False, u'type': u'[Ljava.lang.String;', u'desc': u'MemoryPoolNames'}, u'CollectionCount': {u'rw': False, u'type': u'long', u'desc': u'CollectionCount'}}, u'desc': u'Information on the management interface of the MBean'}}
Voila voila, c'est un peu austère comme méthode mais ça marche.
la JVM n'aura plus de secret pour vous.
Ca consiste juste à ajouter un élément context dans un élement host, dans le server.xml.
"""
<Host appBase="webapps"
autoDeploy="false" name="localhost" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
...
<Context docBase="/home/stuff" path="/static" />
</Host>
"""
637 jours?? vraiment?
en fait y'a plus simple.
comme mettre un Xmx ridiculement petit genre moins de 10M et tenter de charger un war qui demande plus.
un très bon tuto pour apprendre à construire un war avec servlet :)
en utilisant maven
Dans le billet, l'auteur a mis le code d'une servlet qui provoque justement un 'java.lang.OutOfMemoryError: Java heap space'
Ceci afin de tester que le heap dump peut bien se créer à l'endroit qu'on a prévu.
Key gotchas:
1) Use quotes
2) Use only, not .jar
exemple avec le dernier JDK7:
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz
DTC oracle