jconsole使用

摘要:
让我们看一下这个图。根据JConsole和任务管理器之间的比较,堆内存大小大约为250M,几乎有一个程序开始使用idea进行春季启动。对于这种大小的项目,大约有10000个初始类,50个活动线程,CPU利用率可以忽略。创意工具本身占用1.7G内存,这似乎有点大。你需要学习如何使用内存吗?谷歌浏览器的1GB内存也能抵御天气。

先看一张图

jconsole使用第1张

根据JConsole和任务管理器对比,堆内存大小在250M左右,差不多空跑一个程序用idea启动springboot就是这个大小

项目启动初始类在一万个左右,活动线程50个上下,cpu利用率可以忽略。

idea工具本身占用内存在1.7G,这个貌似有点大,具体的内存使用需要后续学习?

google浏览器1G内存感觉也是逆天了。

内存分析这张图比较重要,每一个含义需要搞清楚

jconsole使用第2张

说明:

老年代  PS Old Gen

新生代 PS Eden Space 对象创建存放的区域

新生代 PS Survivor Space 第一次GC之后存放的区域

代码缓存 Code Cache jvm编译和存储本地代码所占用的内存

本地内存也叫元空间 Metaspace 永久代PermGen从JDK8开始被metaspce替代 (jdk8新概念)

类指针压缩空间  Compressed Class Space  (jdk8新概念)

回收的顺序如下

JDK6回收

jconsole使用第3张

jDK8回收

jconsole使用第4张

对metaspace 和 compressed class space做一个专门的解释,看完即懂

先看一张metaspce内存分配图

jconsole使用第5张

 解释 CL是class loader的简写,从本地加载,然后根据一定的算法把二进制字节码加载到元空间

持久代中存的内容
       1. JVM中类的元数据在Java堆中的存储区域。
       2. Java类对应的HotSpot虚拟机中的内部表示也存储在这里。
       3. 类的层级信息,字段,名字。
       4. 方法的编译信息及字节码。
       5. 变量
       6. 常量池和符号解析
GC是可以对持久代进行垃圾收集的   既然JDK8取消了持久代用元数据替代,那么元数据存储的内容就是持久代中存储的内容

元空间特点

  1. 充分利用了Java语言规范中的好处:类及相关的元数据的生命周期与类加载器的一致。
  2. 每个加载器有专门的存储空间
  3. 只进行线性分配
  4. 不会单独回收某个类
  5. 省掉了GC扫描及压缩的时间
  6. 元空间里的对象的位置是固定的
  7. 如果GC发现某个类加载器不再存活了,会把相关的空间整个回收掉

Compressed Class Space

jconsole使用第6张

看图对照解释

JVM中,每个对象都有一个指向它自身类的指针,不过这个指针只是指向具体的实现类,而不是接口或者抽象类。

 64位的JVM  _Mark 占8个字节常量 _klass 指向类的8个字节的指针 

 为了压缩JVM对象中的_klass指针的大小,引入了类指针压缩空间(Compressed Class Pointer Space)。

 从字面上看内存的分析应该是最简单的了

下面线程这个图感觉有点蒙圈

jconsole使用第7张

后续再详细分析

类图  加载了一万个

jconsole使用第8张

VM概要 对内存的一个补充

jconsole使用第9张

MBean也是非常的使用

jconsole使用第10张

免责声明:文章转载自《jconsole使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇迷你MVVM框架 avalonjs 入门教程[转]Android 录制回放原理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

终于理解二级指针的作用了

之前学习swap函数时,知道传递指针可以实现对要交换变量本尊的修改,而直接传递值做不到这一点.究其原因,是因为函数传递参数时是以拷贝的形式,因此函数内部对其拷贝进行操作,不会影响到本尊. 如果想要通过函数实现对一级指针的值进行修改该如何去做呢?如果直接把它传进去,其实修改的是它的拷贝,而对它并没有影响.这个时候就是二级指针出场的时候了. #include...

C/C++ 关于数组和指针的总结

1、数组的声明形如a[d],其中a是数组的名字,d是数组的维度,编译的时候数组的维度应该是已知的,所以维度d必须是一个常量。如果要定义一个不知道元素个数的以为数组,那么请使用vector容器; unsigned cnt = 42; //不是常量表达式 constexpr unsigned sz = 42; //常量表达式 int arr...

<转>boost::any的用法、优点和缺点以及源代码分析

01.#include <iostream> 02.#include <list> 03.#include <boost/any.hpp> 04. 05.typedef std::list<boost::any> list_any; 06. 07.//关键部分:可以存放任意类型的对象 08.void fill...

Delphi指针的定义和取值

效果图如下: 要点: 1.指针的2中定义方法 PInteger 和 ^Integer 2.取地址符号 @ 和 Addr函数 3.取内容符号 ^ ,比如MyPointInt1^则是取MyPointInt1指针所指向的内容了。 program MyPoint; //指针详解 {$APPTYPE CONSOLE} usesSysUtils,windows,G...

iOS 审核被拒

很快首次试飞,就迎来了第一次的惨败,虽然我已有了一些心理准备,但还是有不小打击的,奉上我的被拒理由: 被拒的描述1: From Apple 2. 1 PERFORMANCE: APP COMPLETENESS 2. 3 PERFORMANCE: ACCURATE METADATA Performance - 2.1 We were unable to...

Conservative GC (Part one)

[toc] 保守式GC 保守式GC(Conservative GC)指“不能识别指针和非指针的GC” 不明确的根 不明确的根(ambiguous roots),下面三类都可以作为根。事实上是不明确的根 寄存器 调用栈 全局变量空间 以栈为例:在调用栈中有调用帧(call frame),调用帧里面装着函数内的局部变量和参数值。不过局变量中如果有c语言里面...