黑马JVM总结(四)

news/2025/2/11 19:29:25/

(1)本地方法栈

Java虚拟机调用本地方法时,给本地方法提供的一个内存空间,本地方法它是指哪些不是由java代码编写的方法

java代码有一定限制,它有时候不能直接跟操作系统底层打交道,需要用c和c++语言编写的本地方法来针对与于操作系统底层的API打交道,我们的java代码间接的通过本地方法调用底层的功能,那这些本地方法运行的时候使用的内存叫做本地方法栈 

本地方法是非常多的

像Object类中的clone的克隆方法,它是native的没有方法实现的,它的方法实现都是用C和C++语言编写的,我们java代码通过间接调用Native的本地方法接口间接的调用c或c++的clone方法实现

下面的也是 

(2)堆

我们前面学的线程计数器、虚拟机栈、本地方法栈他们都是线程私有的

堆和方法区,是线程共享的区

(3)堆_内存溢出

对象不在使用了就会被垃圾回收机制回收,如果产生的对象有人在使用,并且一直产生对象,这些对象就不能当做垃圾,堆对象达到一定的数量就会导致,堆慢慢的堆内存被耗尽,产生堆内存溢出

可以修改堆控件的参数:改小一点

次数会变少

(4)堆_内存诊断-jmap

使用jsp检测:查出这个进程号

使用jmp工具检测

执行到2再检测一遍:

执行到3再检测一遍:

 

在byte数组没有创建之前:对象堆占用情况使用了6兆

打印2byte数组创建后查看新创建对象堆的占用情况:变成16兆 
打印3,垃圾回收之后:堆中对象的占用情况:垃圾 回收了变成了1兆

(5)堆_内存诊断-jconsole

出现一个图形化工具:

通过控制台的答应数组情况,在观看图堆内存使用情况:          

这个工具还可以观看线程、类、cpu等信息情况

还可以检测死锁,跟前面jstack工具是一样的

(6)堆_内存诊断-jvirsualvm

比如我们已经把程序运行起来了,但是不知道代码是怎么写的:先通过jps工具查看一下:看到17748这个进程

然后再使用jmap工具:看一下内存区的使用情况

 

Old Generation:老年代内存占用情况 

 总共占用230左右

使用jconsole工具:

在内存选项卡里,执行GC:

 

执行之后内存下降了很多: 但是并不是太多

 

在使用jmap查看一下:新生代内存回收了不少,老年代还有200多

 

 

老年代没有回收,是不是我们变成失误而导致的始终被引用而无法释放它的内存呢?

使用这个可视化工具:jvisualvm

连接到那个Demo13上去:有一个好用的功能堆Dump:它可以抓取堆的快照,然后可以对堆里面的一些详细内容进行分析,这个jconsole所不具备的 

点击对Dump:他就把那一时刻堆的内存信息把它截取下来,并且堆里面有哪些对象,每个对象的个数它也会收集起来,

 在检查里点击查找:找出前20 太占内存的对象

看到第一个ArrayList占用的比较大点击进去查看一下

它的元素里包含的的是一个个Student对象 ,它包含一个byte数组,1兆左右

 共有将近200个元素

 通过分析就大概排查出来了,ArrayList中Student对象导致我们的内存占用比较高而且是长时间使用的,导致垃圾回收没办法回收内存

找到这个代码

在实际生产环境下方式类似,我们首先通过堆转储dump:把内存快照抓下来抓下来之后分析对内存占用较大的对象,就可以得出结论,然后再分析原始代码就行了 


http://www.ppmy.cn/news/1102019.html

相关文章

Arduino驱动TCS3200传感器(颜色传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清…

【算法专题突破】双指针 - 无重复字符的最长子串(10)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:3. 无重复字符的最长子串 - 力扣(Leetcode) 这道题目不难理解,就是查找最长的无重复字符的最长子串, 最后返回最长子串的…

记LGSVL Map Annotation使用

导入点云 内置的点云导入器工具提供了将最流行的点云文件格式(PCD、PLY、LAS、LAZ)转换为可用于仿真的数据所需的所有功能。 要访问点云导入器窗口,请在 Unity 编辑器中打开模拟器项目,然后导航到 Simulator/Import Point Cloud…

C++ STL教程

C 标准模板库的核心包括:(1)容器(Containers);(2)算法(Algorithms);(3)迭代器(iterators) &#…

<el-input-number>显示两位数字;如果是一位数字的话前面补0

可以通过自定义 formatter 函数来实现。具体步骤如下&#xff1a; 在 <el-input-number> 上添加 :formatter 属性&#xff0c;值为 formatter 函数名。 在 methods 中定义 formatter 函数&#xff0c;该函数接收一个参数 value&#xff0c;表示当前输入框中的值。 在 f…

【PyCharm Community Edition】:PCAN-USB上位机开发

PCAN-USB上位机开发 资料准备资料驱动二次开发PCAN-Basic_Windows-4.7.zip计算CAN波特率工具以PCAN-VIEW配置为例请学会查阅帮助文档PCAN-USB对外可用函数问题记录提示BitrateFD的参数不对提示打印错误platform.system()判断不准确继承父类的函数打开PCANBasic.dll偶尔出错优化…

七)Stable Diffussion使用教程:附加功能

图生图右侧有个附加功能选项,里面其实也存在一个图片放大(缩放)功能,而且因为它不涉及重绘的过程,所以不需要任何提示词,适用于任何图片(包括非 SD 生成的图片)。 原理:在拉伸放大的基础上适当对色块和线条的边缘做了模糊处理,和其他工具的放大原理类似。 观察界面…

MyBatis: 设置一次执行多条语句

一、数据库连接地址加参数&#xff1a; jdbc:mysql://xxx.xx.xx.xxx/test?allowMultiQueriestrue二、使用动态SQL foreach <insert id"batchAddPerson"><foreach collection"personList" item"person" separator";">ins…