%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
Java on Linux for devs and ops
1. What Dev and Ops
should know about
Java on Linux?
Alexey Ragozin
alexey.ragozin@gmail.com
2. Java Memory
Java Heap
Young Gen
Old Gen
Perm Gen
Non-Heap
JVM Memory
Thread Stacks
NIO Direct Buffers
Metaspace
Compressed Class Space
Code Cache
Native JVM Memory
Non-JVM Memory (native libraries)
Java 7
Java 8
Java 8
-Xms/-Xmx
-Xmn
-XX:PermSize
-XX:MaxDirectMemorySize
-XX:ReservedCodeCacheSize
-XX:MaxMetaspaceSize
-XX:CompressedClassSpaceSize
JavaProcessMemory
-XX:ThreadStackSize per thread
3. Linux memory
Memory is managed in pages (4k) onx86/AMD64
(Huge page support is mostly defunct in Linux)
Pages from process point of view
- Virtual address reservation
- Committed memory page
- File mapped memory page
4. Linux memory
Pages from OS point of view
PrivateShared
Anonymous File backed
Shared
memory
Private
process
memory
Executables / Libraries
Memory mapped files
Memory
mapped files
Cache / Buffers
https://techtalk.intersec.com/2013/07/memory-part-1-memory-types/
6. Understanding memory metrics
OS Memory
Memory Used/Free – misleading metric
Swap used – should be zero
Buffers/Cached – essentially this is free memory*
Process
VIRT – address space reservation - not a memory!
RES – resident size - key memory footprint
SHR – shared size
7. Understanding memory metrics
Buffers – pages used for file system metadata
Cached – pages mapped to file data
Non-dirty pages used for buffers/cache can
immediately to fulfill memory allocation request.
Dirty pages – writable file mapped pages which has
modifications not synchronized to disk.
8. Linux Process Memory Summary
Virtual
Commited
Resident
Zeroed pages
Swapped pages
9. Java Memory Facts
Swapping intolerance
GC does heap wide scans
SWT pauses prolonged by swapping
are affecting whole application threads
Java never give up memory to OS
Strictly speaking serial GC and G1 does
Practically you should assume it does not
JVM Process footprint > JVM Heap size
10. JVM Out of Memory
JVM heap is full and at –Xmx limit
Full GC, then OOM error if not enough memory reclaimed
OOM error is not recoverable, useful to shutdown gracefully
-XX:OnOutOfMemoryError="kill -9 %p“
JVM heap is full but below –Xmx limit
Heap is extended by requesting more memory from OS
If OS rejects memory requests JVM would crash (no OOM error)
NIOdirectbufferscapacityiscappedbyJVM
-XX:MaxDirectMemorySize=16g
Cap is enfored by JVM
OOM error in case is limit has been reached - recoverable
If request for memory from JVM rejected by OS
JVM would crash
11. Low memory conditions
Low memory condition on server
Swapping / Paging
Dramatic application performance degradation
Application freezes
JVM crashes
Always plan server memory capacity
You should always have physical memory reserve.
12. Linux paravirtualization
In Docker container
Guest resources are capped via Linux cgroups
https://en.wikipedia.org/wiki/Cgroups
Kernel memory pools can be limited
resident / swap / memory mapped
Limits are global for container
Resources restrictions violations remediated by kill -9
Plan your container size carefully
13. ulimits
> ulimit -a
core file size (blocks, -c) 1
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 4134823
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) 449880520
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4134823
virtual memory (kbytes, -v) 425094640
file locks (-x) unlimited
May prevent you
form starting
large JVM
Core dump disabled
14. Setting up JVM
-Xms = -Xmx – reserve memory on start
GC logging options (-XX:+PrintGCDetails, etc)
http://blog.ragozin.info/2016/10/hotspot-jvm-garbage-collection-options.html
GC logging is synchronous avoid network / slow mounts
Do JVM sizing exercise
Choose right GC parallel threads (-XX:ParallelGCThredas)
Sometimes less is better
Getting dump on crash
-XX:+HeapDumpOnOutOfMemoryError – may “crash” Linux
Java heap dump can be produced from Linux core dump
https://docs.oracle.com/javase/8/docs/technotes/guides/
troubleshoot/bugreports004.html#CHDHDCJD
15. Network tuning
Cross region data transfers (client or server)
Tune options at socket level
Tune Linux network caps (sysctl)
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
UDP based communications
net.core.wmem_max
net.core.rmem_max
16. Other OS related tuning
NUMA
numactl --cpunodebind=xxx
ignore JVM Numa* options
KVM hypervisor does not support NUMA for guests
Assigning threads to cores
taskset
Exploiting CPU isolation
Kernel level configuration
Threads should be taskset explicitly
18. Troubleshooting / Diagnostics
Native Linux tools
ps / top / vmstat / pmap / etc
JDK tools
PID based
JVM Attach based tools
Perf counter based tools
JMX based tools (JVisualVM / JConsole)
JVM Flight Recorder – post analysis
GC / JVM logs
19. Troubleshooting / Diagnostics
Native Linux tools
ps / top / vmstat / pmap / etc
JDK tools
PID based
JVM Attach based tools
Perf counter based tools
JMX based tools (JVisualVM / JConsole)
JVM Flight Recorder – post analysis
GC / JVM logs
Affected by
JVM freezes
20. Thread CPU usage
ragoale@axcord02:~> ps -T -p 6857 -o pid,tid,%cpu,time,comm
PID TID %CPU TIME COMMAND
6857 6857 0.0 00:00:00 java
6857 6858 0.0 00:00:00 java
6857 6859 0.0 00:00:16 java
6857 6860 0.0 00:00:16 java
6857 6861 0.0 00:00:18 java
6857 6862 0.1 00:13:05 java
6857 6863 0.0 00:00:00 java
6857 6864 0.0 00:00:00 java
6857 6877 0.0 00:00:00 java
6857 6878 0.0 00:00:00 java
6857 6880 0.0 00:00:20 java
6857 6881 0.0 00:00:04 java
6857 6886 0.0 00:00:00 java
6857 6887 0.0 00:03:07 java
...
This thread mapping is “typical” and not accurate,
use jstack to get Java thread information for thread ID
VM Thread
GC Threads
Other application
and JVM threads
21. Thread CPU usage
jstack (JDK tool)
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode):
"Attach Listener" #65 daemon prio=9 os_prio=0 tid=0x0000000000cbc800 nid=0x1f0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"pool-1-thread-20" #64 prio=5 os_prio=0 tid=0x00000000009d5000 nid=0x1c04 waiting on condition [0x00007fa109e55000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d3ab9e50> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
"pool-1-thread-19" #63 prio=5 os_prio=0 tid=0x0000000000a1e800 nid=0x1bff waiting on condition [0x00007fa109f56000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d3ab9e50> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
...
Linux thread ID in hex
jstack forces STW pause in target JVM!
23. Leaking OS resources
Linux OS has number cap on file handles
if exceeded …
Cannot open new files
Cannot connect / accept socket connections
Garbage collector closes handles automatically
Files and sockets
Eventually …
Always close your files and sockets
Resources which cannot be explicitly disposed
File memory mappings
NIO direct buffers
Unfinalized objects can be inspected in heap dump
24. Other useful JDK tools
jinfo
query / update XX JVM options (e.g. enable/adjust GC logging)
query system properties (including dynamically updated)
jstat
can be used for monitoring heap dynamics
jcmd
universal tool for JVM Attach interface
jcmd PID PerfCounter.print – dumps all JVM perfcounters,
useful for monitoring