JVM学习整理
1. 核心参数
- -Xms2048m、-Xmx2048m、-Xss1024m
其中-x是表示非标准化的参数,-xms表示jvm的heap内存的起始内存,默认是服务器内存的1/64 ,-xmx 表示jvm的heap内存的最大内存,默认是服务器的内存的1/4 ,如果heap内存不够的话,则会抛出 oom outofmemoryError,
【JVM学习整理】-xss 表示线程栈的内存空间大小,java进程中是有多个线程的,每一个线程中内存占有的空间是由-xss控制,如果虚拟机栈或者本地方法栈调用层次不够的话,则会抛出StackOverflowError ,如果扩展线程栈不够的话,则会抛出oom
理解内存构成:-xmx+程序计数器+虚拟机栈+本地方法栈+方法区
文章图片
- -XX:MetaspaceSize,-XX:MaxMetaspaceSize
MetaspaceSize并不是说指定了元空间的大小,而是执行了当metaSpace扩容时触发fullGC的初始化阈值,也就是最小的阈值,对于64位服务器jvm来说,其默认的-XX:MetaspaceSize的值为21MB,如果超过MaxMetaSpaceSize则会抛出OOM,因此可以将metaspaceSize设置大点,MaxMetaSpaecSize可以不设置
- -XX:+PrintGcDetails
查看GC情况
其中,Allocation Failure表示新生代空间不足
141816K->10738k(141824k)表示GC前的内存,GC后的内存,总内存
之后的表示总个堆内从的大小
默认的-xms为1/64
文章图片
? jvm内存模型是由:堆内存、虚拟机栈、本地方法栈、程序计数器、以及方法区,在jvm1.7之前,堆内存是被分为新生代、老年代、和永久代,之前永久代也就是表示方法区,主要存放常量池、静态变量、类信息、编译代码。
? 需要记住的是,在jvm1.8之后,就把方法区给移除了,转成元数据区,该内存区域为本地内存,可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize来指定元空间的大小。
3. jvm优化命令
- jstat
jstat是JDK自带的一个轻量级小工具,利用jvm内建的指令对java应用程序资源和性能进行实时和命令行的监控,包括heap size和GC情况。
jstat -gcutil pid :查询pid的gc情况(gc了多少次,现在一个内存情况) jstat -gc pid 2s 3 : 每隔2s中内查看gc的情况,执行3次
- jps
查看liunx执行的java进程号
jps -v 查看jvm启动的参数
- 堆栈分析jstack
主要分析堆栈空间,也就是分析线程的情况,可以分析出死锁问题,以及cpu100%的问题。
- 堆空间分析jmap
jmap是分析jvm堆的问题,可以检查内存的泄漏、检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小。
jmap -dump:live,format=b,file=dump.hprof pid 进行打印pid的堆dump文件 jmap -heap 打印heap的概要信息、GC使用算法、Heap的配置以及使用情况
4. 专有名词
4.1 内存溢出、内存泄露 内存溢出(out of memory)和内存泄漏是不一样的,内存溢出的话是没有足够的内存供申请者使用,也就是内存不够用,导致放进行去的对象使得内存池溢出了,内存泄露是指程序申请内存后,已经使用了但是无法释放已申请的内存空间,一次内存泄漏不会由太大的问题。内存泄漏的堆积最终会导致内存溢出的。
4.2 dump 在计算机的领域,dump是转存的意思,在jvm中也可以被称为存储jvm运行时的内存空间的使用情况。完整的dump文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,dump可以具有堆dump和堆栈dump,堆dump就可以分析出对应的问题所在。
5. 实际问题
4.1 如何解决OOM问题
文章图片
推荐阅读
- 20190302|20190302 复盘翻盘
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)