jvm 内存,线程,gc分析
1.查看 gc的次数,和各个垃圾回收区域的内存比例 jstat :
jstat -gcutil pid interval(ms) 例子:jstat -gcutil 332 1000
S1: 新生代中Survivor space 1区已使用空间的百分比
E: 新生代已使用空间的百分比
O: 老年代已使用空间的百分比
P: 永久带已使用空间的百分比
YGC: 从应用程序启动到当前,发生Yang GC 的次数
YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
FGC: 从应用程序启动到当前,发生Full GC的次数
FGCT: 从应用程序启动到当前,Full GC所用的时间
GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】
2.内存分析 jmap
2.1 生成堆栈文件
-dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
jmap -dump:live,format=b,file=/data/dump.hprof 21275
2.2 查看jvm 当前配置
jmap -heap 21275
2.3 打印当前内存中对象的数量排序
jmap -histo:live 21275 | more
3.线程分析 jstack
jstack [option] PID
-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
4.生成的服务器,一般按下面进行配置。
8G内存机器:
- JAVA_OPTS="-Djava.awt.headless=true -server -Xms5000m -Xmx5000m -Xmn2500m -=256M -XX:MaxPermSize=512M -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseParNewGC -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -Xloggc:/bankapp/tomcat/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/bankapp/tomcat/logs/heapdump"
4G内存机器:
- JAVA_OPTS="-Djava.awt.headless=true -server -Xms2500m -Xmx2500m -Xmn1000m -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseParNewGC -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -Xloggc:/bankapp/tomcat/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/bankapp/tomcat/logs/heapdump"
注意:jdk1.8的元数据区替代了之前的持久代,而且 元数据区占用linux的内存,不占用jvm内存,这时,如果发现linux内存持续飙高,请注意元数据区。
另一个jdk1.8的jvm内存,会缓慢增加,而不会,jvm一启动就会占用 Xms Xmx指定的值,慢慢增加到 Xms Xmx指定的值。
-XX:MinMetaspaceFreeRatio=30 -XX:MaxMetaspaceFreeRatio=60 ?这两个没发现用处。
-XX:MetaspaceSize=5M -XX:MaxMetaspaceSize=512M
5.内存泄漏模拟(jdk1.8)
5.1堆内存溢出
好处,生成的对象大约占用1M,最后滚局i的值,可以算出内存的大小。
import java.util.ArrayList;
import java.util.List; public class HeapOomMock {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<byte[]>();
int i = 0;
boolean flag = true;
while (flag){
try {
i++;
list.add(new byte[1024 * 1024]);//每次增加一个1M大小的数组对象
}catch (Throwable e){
e.printStackTrace();
flag = false;
System.out.println("count="+i);//记录运行的次数
}
}
}
}
5.1栈溢出
public class StackSOFTest { int depth = 0; public void sofMethod(){
depth ++ ;
sofMethod();
} public static void main(String[] args) {
StackSOFTest test = null;
try {
test = new StackSOFTest();
test.sofMethod();
} finally {
System.out.println("递归次数:"+test.depth);
}
}
}
5.1元数据区溢出(或者是持久代溢出)
问题:通过jvisualvm 查看内存gc时,发现元数据区的类载fullgc时没有被卸载?如果有人知道,请多多指教
import java.lang.reflect.Method; import org.springframework.cglib.proxy.CallbackFilter;
import org.springframework.cglib.proxy.Dispatcher;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor; public class OOMTest { public static void main(String[] args) {
System.out.println("Let us do it now.....");
for(int i=0;i<100000;i++){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TestService.class);
enhancer.setCallbackTypes(new Class[] {
Dispatcher.class, MethodInterceptor.class });
enhancer.setCallbackFilter(new CallbackFilter() {
public int accept(Method method) {
return 1;
}
});
Class clazz = enhancer.createClass();
System.out.println("Time:" + System.currentTimeMillis());
}
}
}
5.jvisualvm
5.1 jvsiualvm local java applications cannot be monitored
echo %TMP%
查看tmp下面的hsperfdata_username
我解决的方法是 把username全部大写。
5.2 单独jvisualvm 安装
${jdk}/bin/jvisualvm
本地jdk中的jvisualvm启动报错
无法连接 Java VisualVM 插件中心
1
解决方式
舍弃jdk自带jvisualvm,下载独立的。
http://visualvm.github.io/releases.html
根据jdk版本选择
${jvisualvm}/etc/visualvm.conf更改被注释的visualvm_jdkhome="..."为本机jdk绝对路径
启动jvisualvm
工具->插件->设置->插件中心->编辑url
https://visualvm.github.io/pluginscenters.html
根据版本选择.gz放到上文url中
jvm 内存,线程,gc分析的更多相关文章
- 【jvm】09-full gc分析思路
[jvm]09-full gc分析思路 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞. ...
- java jvm内存管理/gc策略/参数设置
1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...
- JVM内存管理 + GC垃圾回收机制
2.JVM内存管理 JVM将内存划分为6个部分:PC寄存器(也叫程序计数器).虚拟机栈.堆.方法区.运行时常量池.本地方法栈 PC寄存器(程序计数器):用于记录当前线程运行时的位置,每一个线程都有一个 ...
- 一文搞懂JVM内存结构+GC
一.jvm是干什么的? 大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图: javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到l ...
- JVM内存管理&GC
一.JVM内存划分 |--------------------|-------------PC寄存器-------| |----方法区 ---------|--------------java 虚拟机 ...
- JVM内存区域异常分析
在Java虚拟机规范描述中,除程序计数器外,其他几个运行时区域都有可能发生OutOfMemoryError异常.接下来将对各区域分别进行分析介绍,内容包括触发各区域OutOfMemoryError异常 ...
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...
- JVM内存管理------GC简介
为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...
- jvm系列:Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
随机推荐
- java项目中的异常处理总结
异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要. 比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常. 我找一个比较形象 ...
- 题解【洛谷P2668】[NOIP2015]斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...
- MySQL性能优化---优化方案
1.对查询进行优化,应尽量避免全表查询,首先考虑在where及order by涉及的列上建立索引: 2.应尽量避免where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描: ...
- sqlserver 查看视图语句
本人sql小白一个,在项目中遇到了视图的使用,但是不知道视图的语句怎么查看,所以在网上搜索了一下,查到了一下的查看方式,再次记录一下: 方法一->前提: 已经创建好的视图 sp_helptext ...
- Apollo安装教程
最近一直在研究Apollo的安装问题,浪费了几天时间,所有特意来记录一下安装心得. UBUNTU 14.04安装 这个我是把自己的笔记本全部转换为ubuntu系统,操作相对简单,大家可以自行查找,另外 ...
- IIS 无法读取配置节"system.web.extensions",因为它缺少节声明
IIS 无法读取配置节"system.web.extensions",因为它缺少节声明 先安装ASP.NET 4.0 然后: 今天在本地安装iis,搭建网站,应用程序的时候报错下 ...
- 计算几何-Andrew法-凸包
This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. 利用一下叉积和栈 ...
- 线性筛-mobius,强大O(n)
首先,你要知道什么是莫比乌斯函数 然后,你要知道什么是积性函数 最后,你最好知道什么是线性筛 莫比乌斯反演 积性函数 线性筛,见上一篇 知道了,就可以愉快的写mobius函数了 由定义: μ(n)= ...
- 教你如何用python和pygame制作一个简单的贪食蛇游戏,可自定义
1.效果图 2.完整的代码 #第1步:导出模块 import pygame, sys, random from pygame.locals import * # 第2步:定义颜色变量,在pygame中 ...
- Java - JVM - jinfo
1. 概述 jinfo java 运行时的配置工具 查看 设置 2. 环境 idea 2018.2 java jdk8 3. 准备 写个 死循环 概述 需要查看 jvm 的信息, 必须有个运行中的 j ...