Java内存分析简单介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html
Java内存分析简单介绍:
1.
# 设置内存溢出时自动生成堆内存快照信息
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\log\gc.hprof -XX:+PrintGCDetails -Xloggc:D:\log\gc.log 2. 使用Jmap(Java Memory Map) 生成 堆内存信息文件 HeapDump, 打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节 常见内存错误:
outOfMemoryError 老年代内存不足。
outOfMemoryError:PermGen Space 永久代内存不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。 jmap -dump:live,format=b,file=d:/log/heapdump.hprof 1000 可以将1000进程的内存heap输出出来到d:\log\heapdump.hprof文件里; 用 MAT 分析: Histogram可以列出内存中的对象,对象的个数以及大小。
Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
Top consumers通过图形列出最大的object。
Leak Suspects通过MA自动分析泄漏的原因。 Histogram:
Class Name : 类名称,java类名
Objects : 类的对象的数量,这个对象被创建了多少个
Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和 Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。 Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage GC ROOTS
|
|--ObjectA
|--ObjectB
|----|--ObjectC
|----|--ObjectD
|--ObjectD 可以看出, GC ROOTS直接引用了 A, B, D 三个对象:
A : Retained Size(A) = Shallow Size(A)
B : Retained Size(B) = Shallow Size(B) + Shallow Size(C) (此处因为D直接被GCROOTS引用, 所以这里不包含D)
D : Retained Size(D) = Shallow Size(D) 如果D不被GC ROOTS直接引用如下:
GC ROOTS
|
|--ObjectA
|--ObjectB
|----|--ObjectC
|----|--ObjectD
A : Retained Size(A) = Shallow Size(A)
B : Retained Size(B) = Shallow Size(B) + Shallow Size(C) + Shallow Size(D)
D : Retained Size(D) = Shallow Size(D)
Java内存分析简单介绍的更多相关文章
- Java内存分析--栈--堆
Java内存分析--栈--堆 JVM的内存分析: 1.栈内存 1.连续的存储空间,遵循后进先出的原则. 2.每个线程包含一个栈区,栈区只保存基础数据类型的对象和自定义对象的引用. 3.每个栈中的数据都 ...
- 13 数组 Java内存分析 三种初始化
Java内存分析 三种初始化 静态初始化 //静态初始化 创建+赋值 int[] a = {1,2,3}; Man[] mans = {new Man(1,1),new Man(2,2)}; 动态初始 ...
- Java内存分析1 - 从两个程序说起
这次看一些关于JVM内存分析的内容. 两个程序 程序一 首先来看两个程序,这里是程序一:JVMStackTest,看下代码: package com.zhyea.robin.jvm; public c ...
- JVM高级特性-一、java内存结构区域介绍
区域划分: java虚拟机在执行程序的过程中,将内存分为功能不同的几个区域,如下图: 此图列出了内存划分的各个区域,其中 线程私有的:程序计数器.虚拟机栈.本地方法栈 线程共享的:堆.方法区 下面,逐 ...
- [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程
面向对象的内存分析 参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html :尚学堂JAVA300集-064内存分析详解_栈_堆 ...
- java随机数Reandom(简单介绍)
简单介绍 Java中存在着两种Random函数 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0, ...
- Java内存分析工具MAT
MAT是一个强大的内存分析工具,可以快捷.有效地帮助我们找到内存泄露,减少内存消耗分析工具.内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆 ...
- Java 内存分析之mat安装
有三款内存分析的工具 免费 VisualVM MAT 下载地址https://www.eclipse.org/mat/ mac 下面 under the current working directo ...
- Java 内存模型简单剖析
Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果. 主内存与工作内存 处理器上的寄存器的读写的速度比内存快几个数量级,为了解决 ...
随机推荐
- javaScript系列 [43]-TS、Class and ES5
本文讨论Typescript中的Class同ES5构造函数的对应关系,涉及TypeScript的诸多语法.构造函数.面向对象以及原型对象等相关知识点细节,本文只简单对比并不进行深入展开. TypeSc ...
- .NET 微服务——CI/CD(2):自动打包镜像
准备工作 一.开启docker的tcp 我的服务器是linux,以端口2376为例,找到docker.service,在ExecStart下新增这段代码即可: -H tcp://0.0.0.0:237 ...
- sqlsugar freesql hisql 三个ORM框架性能测试对比
hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...
- Cannot uninstall 'pyparsing'. It is a distutils installed project
我的环境: [root@ansible ~]# python -V Python 2.7.5 [root@ansible ~]# cat /etc/redhat-release CentOS Linu ...
- python安装第三方库的步骤
windows下举例:1.下载openpyxl,http://pypi.doubanio.com/simple/openpyxl/2.将下载后的文件解压放到Python文件夹下的Lib文件夹下3.cm ...
- github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得
1.前言 使用 git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...
- SQL高级优化(五)之执行计划
一.explain 执行计划:在MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的. explain:MySQL执行计划的工具,查看MySQL如 ...
- windos 安装 redis 启动闪退
本来想在linux上安装redis的,后来觉得也没必要,主要是了解使用方法,和原理,在什么平台上安装都是大同小异的 接下来简单描述下碰到的小问题:闪退和启动失败 究其原因就是端口被占用了,但是自己并没 ...
- mysql5.7安装和卸载过程
安装mysql 5.7 点击下面链接下载 mysql-5.7.27-winx64.zip 压缩文件 链接:https://pan.baidu.com/s/1CF5mmKkZkD_hxsjFOQJrzw ...
- 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构
工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...