SlideShare a Scribd company logo
Java и Linux
Особенности
Эксплуатации
Алексей Рагозин
Java Vs Linux
Java VM
Managed memory
Garbage collection
Multithreading
Cross platform API
File system
Networking
Linux – User space VM
Memory management
 Virtual memory
Permissive multitasking
File system and networking
Memory
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
Linux memory
Memory is managed in pages (4k) onx86/AMD64
(Huge page support exist on Linux, but it has own problems)
Pages from process point of view
 Virtual address reservations - mmap PROT_NONE
 Committed memory pages
 File mapped memory pages
Linux memory
Pages from OS point of viewPrivateShared
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/
Understanding memory metrics
Understanding memory metrics
OS Memory
 Memory Used/Free – misleading metric
 Swap used – should be zero
 Buffers/Cached – essentially, it is free memory*
Process
 VIRT – address space reservation - not a memory!
 RES – resident size - key memory footprint
 SHR – shared size
Understanding memory metrics
 Buffers – pages used for non-file disk data
 Cached – pages mapped to file data
Non-dirty pages – are essentially free memory.
Such pages can be used immediately to fulfill
memory allocation request.
Dirty pages – writable file mapped pages which has
modifications not synchronized to disk.
Linux Process Memory Summary
Resident
Commited
Virtual
Zeroed Pages + Swap
Java Memory Facts
Swapping intolerance
 GC does heap wide scans
 Any Java thread blocked by page fault can block Stop the World pause
Java never give up memory to OS
 Yes, G1 and serial collector can give memory back to OS
 In practice, JVM would still hold all memory it is allowed too
Out of Memory in Java
public void doWork() {
Object[] hugeArray = new Object[HUGE_SIZE];
for(int i = 0; i != hugeArray.length; ++i) {
hugeArray[i] = calc(i);
}
}
Out of Memory in Linux
public void doWork() {
Object[] hugeArray = new Object[HUGE_SIZE];
for(int i = 0; i != hugeArray.length; ++i) {
hugeArray[i] = calc(i);
}
}
JVM Out of Memory
JVM heap is full and –Xmx limit reached
 Start Full GC
 If reclaimed memory below threshold throw OutOfMemoryError
 OOM error is not recoverable, useful to shutdown gracefully
 -XX:OnOutOfMemoryError="kill -9 %p“
 OOM can be caught and discarded prolonging agony
JVM Out of Memory
JVM heap is full and at –Xmx limit
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)
JVM Out of Memory
JVM heap is full and at –Xmx limit
JVM heap is full but below –Xmx limit
NIOdirectbufferscapacityiscappedbyJVM
 -XX:MaxDirectMemorySize=16g
 Cap is enfored by JVM
 OOM error in case is limit has been reached – recoverable
Sizing Java Process
Live set – test empirically
Young space size – control GC frequency
(G1 collector manages young size automatically)
Heap size – young space + live set + reserve
Reserve – 30% - 50% of live set
JVM Process memory footprint > Java Heap Size
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
Java in Docker
 Guest resources are capped via Linux cgroups
 Kernel memory pools can be limited
resident / swap / memory mapped
 Limits are global for container
 Resources restrictions violations remediated
by container termination
Plan your container size carefully
Threads
Java Threads
Java threads are normal OS threads
 Each Java thread are mapped to Linux thread
 Java code shares stack with native code
 You can use many native Linux tools for diagnostic
Java Threads in ps
ragoale@srvclsd02:~> 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 Operation Thread
GC Threads
Other application
and JVM threads
Java Thread in jstack
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)
...
Linux thread ID in hex
jstack forces STW pause in target JVM!
Thread CPU usage in JVM
sjk ttop command - https://github.com/aragozin/jvm-tools
2016-07-27T07:47:20.674-0400 Process summary
process cpu=8.11%
application cpu=2.17% (user=1.52% sys=0.65%)
other: cpu=5.95%
GC cpu=0.00% (young=0.00%, old=0.00%)
heap allocation rate 1842kb/s
safe point rate: 1.1 (events/s) avg. safe point pause: 0.43ms
safe point sync time: 0.01% processing time: 0.04% (wallclock time)
[003120] user= 1.12% sys= 0.24% alloc= 983kb/s - RMI TCP Connection(1)-172.17.168.11
[000039] user= 0.30% sys= 0.26% alloc= 701kb/s - DB feed - UserPermission.DBWatcher
[000053] user= 0.00% sys= 0.05% alloc= 50kb/s - Statistics
[000038] user= 0.00% sys= 0.05% alloc= 4584b/s – Reactor-0
[000049] user= 0.00% sys= 0.03% alloc= 38kb/s - DB feed - UserInfo.DBWatcher
[000036] user= 0.00% sys= 0.03% alloc= 0b/s - Abandoned connection cleanup thread
[003122] user= 0.00% sys= 0.03% alloc= 4915b/s - JMX server connection timeout 3122
[000040] user= 0.10% sys=-0.09% alloc= 8321b/s - DB feed - Report.DBWatcher
[000050] user= 0.00% sys= 0.01% alloc= 24kb/s - DB feed - Rule.DBWatcher
[000051] user= 0.00% sys= 0.01% alloc= 9034b/s - DB feed - EmailAccount.DBWatcher
[000044] user= 0.00% sys= 0.01% alloc= 4840b/s - DB feed - Analytics.DBWatcher
[000041] user= 0.00% sys= 0.01% alloc= 9999b/s - DB feed - Contact.DBWatcher
[000054] user= 0.00% sys= 0.01% alloc= 3481b/s – Statistics
[000001] user= 0.00% sys= 0.00% alloc= 0b/s - main
[000002] user= 0.00% sys= 0.00% alloc= 0b/s - Reference Handler
[000003] user= 0.00% sys= 0.00% alloc= 0b/s – Finalizer
Does not infer STW pauses on target process
Java Threads - Conclusion
Java threads are native OS threads
 Use Linux diagnostic tools
-XX:+PreserveFramePointer – make Java stack “walkable”
JIT symbol generation - https://github.com/jvm-profiling-tools/perf-map-agent
 Exploit taskset to control CPU affinity
Control number of system Java threads
 Limit number of parallel GC threads -XX:ParallelGCThredas
Networking and IO
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
Leaking OS resources
Linux OS has number cap on file handles
if exceeded …
 Cannot open new files
 Cannot connect / accept socket connections
Leaking OS resources
Linux OS has number cap on file handles
Java Garbage collector closes handles automatically
 Files and sockets
 Eventually …
Leaking OS resources
Linux OS has number cap on file handles
Java Garbage collector closes handles automatically
 Files and sockets
 Eventually …
Best practices
 Always close your files and sockets explicitly
 You should explicitly close socket object after SocketException
Leaking OS resources
Resources which cannot be explicitly disposed
 File memory mappings
 NIO direct buffers
Diagnostics
 Java heap dump can be analyzed for objects pending finalization
Conclusion
Conclusion
You must size JVM
 Heap size = young space + live set + reserve
 JVM footprint = heap size + extra
You can use native Linux diagnostic tools for JVM
Learn JDK command line tools
 Tip: you can use JDK tools with Linux core dump
Linux tuning
 Do network tuning on non-frontend servers too
 Beware THP (Transparent Huge Pages)
Links
Java Memory Tuning and Diagnostic
 http://blog.ragozin.info/2016/10/hotspot-jvm-garbage-collection-options.html
 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
 Using JDK tools with Linux core dumps
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/bugreports004.html#CHDHDCJD
Linux Transparent Huge Pages reading
 https://www.perforce.com/blog/tales-field-taming-transparent-huge-pages-linux
 https://tobert.github.io/tldr/cassandra-java-huge-pages.html
 https://alexandrnikitin.github.io/blog/transparent-hugepages-measuring-the-performance-impact/
Profiling and performance monitoring
 https://github.com/jvm-profiling-tools/perf-map-agent
 https://github.com/aragozin/jvm-tools
THANK YOU
Alexey Ragozin
alexey.ragozin@gmail.com
https://blog.ragozin.info
https://github.com/aragozin

More Related Content

PPTX
Devoxx France 2018 : Mes Applications en Production sur Kubernetes
PDF
Elastic 101 tutorial - Percona Europe 2018
PDF
Distributed systems at ok.ru #rigadevday
PPTX
The Art of JVM Profiling
PPTX
Don't dump thread dumps
PDF
Everything you wanted to know about Stack Traces and Heap Dumps
PDF
Varnish in action phpday2011
PPTX
Do we need Unsafe in Java?
Devoxx France 2018 : Mes Applications en Production sur Kubernetes
Elastic 101 tutorial - Percona Europe 2018
Distributed systems at ok.ru #rigadevday
The Art of JVM Profiling
Don't dump thread dumps
Everything you wanted to know about Stack Traces and Heap Dumps
Varnish in action phpday2011
Do we need Unsafe in Java?

What's hot (20)

PDF
Varnish in action phpuk11
PPTX
Become a GC Hero
PDF
Java In-Process Caching - Performance, Progress and Pittfalls
PPTX
Become a Garbage Collection Hero
PDF
Varnish in action confoo11
PDF
Barcelona apc mem2010
KEY
JavaOne 2012 - JVM JIT for Dummies
PPTX
DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...
PDF
MongoDB: Optimising for Performance, Scale & Analytics
PDF
Varnish in action pbc10
PDF
Top Node.js Metrics to Watch
PDF
How to Test Asynchronous Code (v2)
PPTX
Hands on Data Grids - Stephen Milidge
PDF
Python twisted
PDF
APC & Memcache the High Performance Duo
PDF
Dr. Low Latency or: How I Learned to Stop Worrying about Pauses and Love the ...
PDF
Kickin' Ass with Cache-Fu (without notes)
 
PPTX
GC Tuning & Troubleshooting Crash Course
PPTX
RedisConf17- durable_rules
PDF
Add a bit of ACID to Cassandra. Cassandra Summit EU 2014
Varnish in action phpuk11
Become a GC Hero
Java In-Process Caching - Performance, Progress and Pittfalls
Become a Garbage Collection Hero
Varnish in action confoo11
Barcelona apc mem2010
JavaOne 2012 - JVM JIT for Dummies
DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...
MongoDB: Optimising for Performance, Scale & Analytics
Varnish in action pbc10
Top Node.js Metrics to Watch
How to Test Asynchronous Code (v2)
Hands on Data Grids - Stephen Milidge
Python twisted
APC & Memcache the High Performance Duo
Dr. Low Latency or: How I Learned to Stop Worrying about Pauses and Love the ...
Kickin' Ass with Cache-Fu (without notes)
 
GC Tuning & Troubleshooting Crash Course
RedisConf17- durable_rules
Add a bit of ACID to Cassandra. Cassandra Summit EU 2014
Ad

Similar to Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк) (20)

PDF
Java on Linux for devs and ops
PDF
Mastering java in containers - MadridJUG
PDF
Non-blocking I/O, Event loops and node.js
PPTX
Don't dump thread dumps
PDF
Using apache spark for processing trillions of records each day at Datadog
PDF
Java In-Process Caching - Performance, Progress and Pitfalls
PDF
What to do if Your Kafka Streams App Gets OOMKilled? with Andrey Serebryanskiy
PPTX
Think Distributed: The Hazelcast Way
PPTX
16 ARTIFACTS TO CAPTURE WHEN YOUR CONTAINER APPLICATION IS IN TROUBLE
PDF
Bpug mcollective 20140624
PDF
Cache is King: Get the Most Bang for Your Buck From Ruby
PPTX
Distributed caching and computing v3.7
PPTX
How to Troubleshoot 9 Types of OutOfMemoryError
PPTX
Jug Lugano - Scale over the limits
PPTX
PPTX
How to Troubleshoot 9 Types of OutOfMemoryError
PDF
Docker and friends at Linux Days 2014 in Prague
PDF
Meder Kydyraliev - Mining Mach Services within OS X Sandbox
PDF
Jvm operation casual talks
PDF
Where is my cache architectural patterns for caching microservices by example
Java on Linux for devs and ops
Mastering java in containers - MadridJUG
Non-blocking I/O, Event loops and node.js
Don't dump thread dumps
Using apache spark for processing trillions of records each day at Datadog
Java In-Process Caching - Performance, Progress and Pitfalls
What to do if Your Kafka Streams App Gets OOMKilled? with Andrey Serebryanskiy
Think Distributed: The Hazelcast Way
16 ARTIFACTS TO CAPTURE WHEN YOUR CONTAINER APPLICATION IS IN TROUBLE
Bpug mcollective 20140624
Cache is King: Get the Most Bang for Your Buck From Ruby
Distributed caching and computing v3.7
How to Troubleshoot 9 Types of OutOfMemoryError
Jug Lugano - Scale over the limits
How to Troubleshoot 9 Types of OutOfMemoryError
Docker and friends at Linux Days 2014 in Prague
Meder Kydyraliev - Mining Mach Services within OS X Sandbox
Jvm operation casual talks
Where is my cache architectural patterns for caching microservices by example
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Recently uploaded (20)

PPTX
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
PPTX
CYBER-CRIMES AND SECURITY A guide to understanding
PPTX
Strings in CPP - Strings in C++ are sequences of characters used to store and...
PPTX
additive manufacturing of ss316l using mig welding
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
PDF
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
PPTX
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
PPTX
Sustainable Sites - Green Building Construction
PDF
Operating System & Kernel Study Guide-1 - converted.pdf
PPTX
Construction Project Organization Group 2.pptx
PDF
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
PDF
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
PPTX
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
PPTX
Lecture Notes Electrical Wiring System Components
PPTX
UNIT 4 Total Quality Management .pptx
PPTX
Lesson 3_Tessellation.pptx finite Mathematics
DOCX
573137875-Attendance-Management-System-original
PPT
Mechanical Engineering MATERIALS Selection
PPTX
MCN 401 KTU-2019-PPE KITS-MODULE 2.pptx
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
CYBER-CRIMES AND SECURITY A guide to understanding
Strings in CPP - Strings in C++ are sequences of characters used to store and...
additive manufacturing of ss316l using mig welding
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
Embodied AI: Ushering in the Next Era of Intelligent Systems
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
Sustainable Sites - Green Building Construction
Operating System & Kernel Study Guide-1 - converted.pdf
Construction Project Organization Group 2.pptx
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
Lecture Notes Electrical Wiring System Components
UNIT 4 Total Quality Management .pptx
Lesson 3_Tessellation.pptx finite Mathematics
573137875-Attendance-Management-System-original
Mechanical Engineering MATERIALS Selection
MCN 401 KTU-2019-PPE KITS-MODULE 2.pptx

Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)

  • 2. Java Vs Linux Java VM Managed memory Garbage collection Multithreading Cross platform API File system Networking Linux – User space VM Memory management  Virtual memory Permissive multitasking File system and networking
  • 4. 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
  • 5. Linux memory Memory is managed in pages (4k) onx86/AMD64 (Huge page support exist on Linux, but it has own problems) Pages from process point of view  Virtual address reservations - mmap PROT_NONE  Committed memory pages  File mapped memory pages
  • 6. Linux memory Pages from OS point of viewPrivateShared 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/
  • 8. Understanding memory metrics OS Memory  Memory Used/Free – misleading metric  Swap used – should be zero  Buffers/Cached – essentially, it is free memory* Process  VIRT – address space reservation - not a memory!  RES – resident size - key memory footprint  SHR – shared size
  • 9. Understanding memory metrics  Buffers – pages used for non-file disk data  Cached – pages mapped to file data Non-dirty pages – are essentially free memory. Such pages can be used immediately to fulfill memory allocation request. Dirty pages – writable file mapped pages which has modifications not synchronized to disk.
  • 10. Linux Process Memory Summary Resident Commited Virtual Zeroed Pages + Swap
  • 11. Java Memory Facts Swapping intolerance  GC does heap wide scans  Any Java thread blocked by page fault can block Stop the World pause Java never give up memory to OS  Yes, G1 and serial collector can give memory back to OS  In practice, JVM would still hold all memory it is allowed too
  • 12. Out of Memory in Java public void doWork() { Object[] hugeArray = new Object[HUGE_SIZE]; for(int i = 0; i != hugeArray.length; ++i) { hugeArray[i] = calc(i); } }
  • 13. Out of Memory in Linux public void doWork() { Object[] hugeArray = new Object[HUGE_SIZE]; for(int i = 0; i != hugeArray.length; ++i) { hugeArray[i] = calc(i); } }
  • 14. JVM Out of Memory JVM heap is full and –Xmx limit reached  Start Full GC  If reclaimed memory below threshold throw OutOfMemoryError  OOM error is not recoverable, useful to shutdown gracefully  -XX:OnOutOfMemoryError="kill -9 %p“  OOM can be caught and discarded prolonging agony
  • 15. JVM Out of Memory JVM heap is full and at –Xmx limit 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)
  • 16. JVM Out of Memory JVM heap is full and at –Xmx limit JVM heap is full but below –Xmx limit NIOdirectbufferscapacityiscappedbyJVM  -XX:MaxDirectMemorySize=16g  Cap is enfored by JVM  OOM error in case is limit has been reached – recoverable
  • 17. Sizing Java Process Live set – test empirically Young space size – control GC frequency (G1 collector manages young size automatically) Heap size – young space + live set + reserve Reserve – 30% - 50% of live set JVM Process memory footprint > Java Heap Size
  • 18. 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
  • 19. Java in Docker  Guest resources are capped via Linux cgroups  Kernel memory pools can be limited resident / swap / memory mapped  Limits are global for container  Resources restrictions violations remediated by container termination Plan your container size carefully
  • 21. Java Threads Java threads are normal OS threads  Each Java thread are mapped to Linux thread  Java code shares stack with native code  You can use many native Linux tools for diagnostic
  • 22. Java Threads in ps ragoale@srvclsd02:~> 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 Operation Thread GC Threads Other application and JVM threads
  • 23. Java Thread in jstack 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) ... Linux thread ID in hex jstack forces STW pause in target JVM!
  • 24. Thread CPU usage in JVM sjk ttop command - https://github.com/aragozin/jvm-tools 2016-07-27T07:47:20.674-0400 Process summary process cpu=8.11% application cpu=2.17% (user=1.52% sys=0.65%) other: cpu=5.95% GC cpu=0.00% (young=0.00%, old=0.00%) heap allocation rate 1842kb/s safe point rate: 1.1 (events/s) avg. safe point pause: 0.43ms safe point sync time: 0.01% processing time: 0.04% (wallclock time) [003120] user= 1.12% sys= 0.24% alloc= 983kb/s - RMI TCP Connection(1)-172.17.168.11 [000039] user= 0.30% sys= 0.26% alloc= 701kb/s - DB feed - UserPermission.DBWatcher [000053] user= 0.00% sys= 0.05% alloc= 50kb/s - Statistics [000038] user= 0.00% sys= 0.05% alloc= 4584b/s – Reactor-0 [000049] user= 0.00% sys= 0.03% alloc= 38kb/s - DB feed - UserInfo.DBWatcher [000036] user= 0.00% sys= 0.03% alloc= 0b/s - Abandoned connection cleanup thread [003122] user= 0.00% sys= 0.03% alloc= 4915b/s - JMX server connection timeout 3122 [000040] user= 0.10% sys=-0.09% alloc= 8321b/s - DB feed - Report.DBWatcher [000050] user= 0.00% sys= 0.01% alloc= 24kb/s - DB feed - Rule.DBWatcher [000051] user= 0.00% sys= 0.01% alloc= 9034b/s - DB feed - EmailAccount.DBWatcher [000044] user= 0.00% sys= 0.01% alloc= 4840b/s - DB feed - Analytics.DBWatcher [000041] user= 0.00% sys= 0.01% alloc= 9999b/s - DB feed - Contact.DBWatcher [000054] user= 0.00% sys= 0.01% alloc= 3481b/s – Statistics [000001] user= 0.00% sys= 0.00% alloc= 0b/s - main [000002] user= 0.00% sys= 0.00% alloc= 0b/s - Reference Handler [000003] user= 0.00% sys= 0.00% alloc= 0b/s – Finalizer Does not infer STW pauses on target process
  • 25. Java Threads - Conclusion Java threads are native OS threads  Use Linux diagnostic tools -XX:+PreserveFramePointer – make Java stack “walkable” JIT symbol generation - https://github.com/jvm-profiling-tools/perf-map-agent  Exploit taskset to control CPU affinity Control number of system Java threads  Limit number of parallel GC threads -XX:ParallelGCThredas
  • 27. 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
  • 28. Leaking OS resources Linux OS has number cap on file handles if exceeded …  Cannot open new files  Cannot connect / accept socket connections
  • 29. Leaking OS resources Linux OS has number cap on file handles Java Garbage collector closes handles automatically  Files and sockets  Eventually …
  • 30. Leaking OS resources Linux OS has number cap on file handles Java Garbage collector closes handles automatically  Files and sockets  Eventually … Best practices  Always close your files and sockets explicitly  You should explicitly close socket object after SocketException
  • 31. Leaking OS resources Resources which cannot be explicitly disposed  File memory mappings  NIO direct buffers Diagnostics  Java heap dump can be analyzed for objects pending finalization
  • 33. Conclusion You must size JVM  Heap size = young space + live set + reserve  JVM footprint = heap size + extra You can use native Linux diagnostic tools for JVM Learn JDK command line tools  Tip: you can use JDK tools with Linux core dump Linux tuning  Do network tuning on non-frontend servers too  Beware THP (Transparent Huge Pages)
  • 34. Links Java Memory Tuning and Diagnostic  http://blog.ragozin.info/2016/10/hotspot-jvm-garbage-collection-options.html  https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html  Using JDK tools with Linux core dumps https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/bugreports004.html#CHDHDCJD Linux Transparent Huge Pages reading  https://www.perforce.com/blog/tales-field-taming-transparent-huge-pages-linux  https://tobert.github.io/tldr/cassandra-java-huge-pages.html  https://alexandrnikitin.github.io/blog/transparent-hugepages-measuring-the-performance-impact/ Profiling and performance monitoring  https://github.com/jvm-profiling-tools/perf-map-agent  https://github.com/aragozin/jvm-tools