LoadRunner性能测试系统学习教程:堆与栈(9)
cac55 2024-09-26 07:28 15 浏览 0 评论
上期我们讲到LoadRunner性能测JVM调优,这期我们讲LoadRunner性能测试堆与栈。
堆与栈
在上节介绍JVM内存模型时,发现JVM内存分为堆和栈两种,那么为什么需要将内存分为堆和栈两种呢?之所以分成两类是为了JVM在调用内存时更好的对内存进行管理。
在JAVA虚拟机中使用的数据又分为两类:一是基础数据;二是引用数据。基础数据是引用数据本身,引用数据是引用数据对象。
基础数据通常包括:
byte、short、int、long、char
float、double、Boolean、returnAddres。
引用类型包括:接口、类、数组。
栈是运行单位,所以的运行对象,都在是栈中。
当程序运行时JVM会为每个线程一个栈大小。每个线程栈是不通用的,因为每个任务都有一个独立的线程来执行。堆是存储单位,所以有需要使用的数据都在堆中,堆是可以共享的。也就是堆是处理的数据的地方,栈是用来处理的逻辑的地方。之所以分堆与栈,这样的好处是可以将业务逻辑与数据进行分离,同时也可以提高数据的共享程度。
从软件设计的角度来看,栈代表了处理逻辑,而堆代表了数据,这样将数据与逻辑分离可以让处理逻辑更为清晰。这种隔离、模块化的思想在软件设计的方方面面都有体现。
堆与栈的分离,使得堆中的内容可以被多个栈共享,但栈不管理Java栈还是方法栈其线程都是私有的,是无法共享的,所以这样就可以让数据被多个线程共享进行操作。
这种共享有很多好处,一方面提供了一种有效的数据交互方式(如内存共享),另一方面,节省了内存空间。
栈因为运行时的需要进行地段的划分。由于栈只能向上增长,因此会限制住栈存储内容的能力。而堆不同,堆的大小可以根据需要动态增长。因此,堆与栈的分离,使得动态增长成为可能,相应栈中只需要记录堆中的一个地址即可。
PermGen与Metaspace区别
在java8之前JVM第三代都是持久代PermGen,
在java8和之后的版本都是Metaspace元空间。
持久代PermGenspace的全称是
PermanentGenerationspace
是指内存的永久保存区域,那么为什么会出现内存溢出呢?
这是因为存放Class的信息在被加载时会放入到持久代PermGenspace区域,如果出现很多Class的话
那么就会可能出现PermGenspace错误。
JVM类型也很多种,比如
Oralce-SunHotspot、ralceJRockit、IBMJ9
TaobaoJVM等等。当然用的最多的还是Hotspot。
需要注意的是,PermGenspace是Oracle-SunHotspot才有,JRockit以及J9是没有这个区域。一般现在讨论的多的是Hotspot的JVM,所以通常会说持久代。
持久代中包含了虚拟机中所有通过反射获取到的数据,如类和方法对象,不同的Java虚拟机之间可能会进行类的共享操作,因此持久代又分为只读区和读写区。关于JVM运行时会使用到多少持久代的空间取决于应该程序用到了多少类。
除此之外,JavaSE库中的类和方法也都存储在这里。当JVM对类的操作完成后,发现不再需要使用这个类时,就会将这个类释放出来,释放的空间需要使用FullGC进行回收。
那么持久代是如何来设置呢?在JVM中可以通过MaxPermSize参数来设置,默认值为64M,Java堆中分配的区域尽量是连续的,如果非连续的堆空间,那要定位出持久代到新对象的引用是非常复杂的也是很耗时的。
在堆中有一种记忆集叫卡表,可以记录某个内存在普通对象指针的修改情况。当持久代都使用了后,系统就会抛出OutOfMemoryError的异常信息,当然解决的办法就是清理了不用的类或者增加MaxPermSize的值。
那么在现在的JVM中为何将原来的持久代取消了呢?因为原来的持久代有以下一些缺点:
1)以前的版本中PermGen会存储一些字符串,PermGen内存的大小是通过-xx:PermSize这个参数来设置的,但是由于字符串池的大小经常是变化的,导致设置-xx:PermSize
这个参数变的困难这样很容易出现
OOM提示的错误
java.lang.OutOfMemoryError:PermGenspace。
2)以前将方法主要存储在PermGen,
现在将方法都移动Metaspace,Metaspace不在JVM中
而是在本地的内存。
3)减少经常使用FullGC的频率。
根据上面的各种原因,永久代最终被移除
永久代移除后,原来永久代中的方法区移至Metaspace元空间中,字符串常量移至JavaHeap堆中。
Metaspace元空间由两大部分组成:
KlassMetaspace和NoKlassMetaspace。
1)KlassMetaspace
KlassMetaspace是用来存放klass的,就是class文件在JVM中运行时的数据结构,这部分内存空间默认放在
CompressedClassPointerSpace中
是一个连续的内存区域块,紧接着Heap堆
在JVM中可以
-XX:CompressedClassSpaceSize
来控制这块内存大小默认值为1G。
CompressedClassPointerSpace不是必须存在的
如果设置了
-XX:-UseCompressedClassPointers
或者设置的-Xmx值大于32G,那么这块内存就不会存在
这种情况下klass就会存在
NoKlassMetaspace中。
2)NoKlassMetaspace
NoKlassMetaspace专门来存klass相关的其它内容,
如method、constantPool等,它可以是多个不连续的内存组成。
这块内存是必须的,不能不存在,并且是在本地内存中进行分配。
KlassMetaspace和NoKlassMetaspace两个部分的内存空间是所有类加载器都可以共享的,当然这些加载器都需要分配内存,为了更好的管理这些类加载器,每个类加载器都有一个SpaceManger空间管理来管理这些类加载器如何分配内存大小。分配的内存都是来自于实内存,如果KlassMetaspace用完了,那么就会提醒OutOfMemoryError异常,
但一般的情况下是不会出现这种情况的,NoKlassMetaspace是由一小块一小块内存累加起来的。
元空间和持久代在使用内存上是很类似的,都是对JVM规范中方法区的实现,但是他们分配内存是不同的,持久代内存是在虚拟机中,但是元空间是本地内存,所以正常情况下元空间的大小不受限制,如果说受限制那只是受本地内存限制,并且元空间一般是不可能会出现OutOfMemoryError异常的。设置元空间大小一般可以通过以下几个参数来实现:
1)-XX:MetaspaceSize
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么就会提高该元空间的值。
但不管怎么提高或增加元空间的值,都不能超过MaxMetaspaceSize所设置的值。
2)-XX:MaxMetaspaceSize
-XX:MaxMetaspaceSize表示元空间可以达到的最大值,默认是没有限制的,取决于机器的内存,限制类的元数据使用的内存大小,以免出现虚拟内存切换以及本地内存分配失败。如果怀疑有类加载器出现泄露,应当设置这个参数;元空间的初始大小是21M,这是GC的初始的高水位线,超过这个大小会进行FullGC来进行类的回收。如果启动后GC过于频繁,请将该值设置得大一些,可以设置成和持久代一样的大小,这个GC可以不用那么频繁的执行。
3)-XX:MinMetaspaceFreeRatio
-XX:MinMetaspaceFreeRatio表示GC之后,最小的Metaspace剩余空间容量的百分比,目的是控制减少为分配空间所导致的垃圾收集。
MinMetaspaceFreeRatio和下面的
MaxMetaspaceFreeRatio,
主要是影响触发metaspaceGC的阈值。默认值为40,表示每次GC完之后
如果metaspace内存的空闲比例小于
MinMetaspaceFreeRatio%
那么将尝试做扩容。
增大触发metaspaceGC的阈值。不过这个增量至少是MinMetaspaceExpansion才会做,不然不会增加这个阈值。
这个参数主要是为了避免触发metaspaceGC的阈值和GC之后committed的内存的量比较接近,于是将这个阈值进行扩大。
注:这里不用GC之后used的量来算
主要是担心可能出现committed的量超过了触发metaspaceGC的阈值,这种情况一旦发生会很危险,会不断做GC。
4)-XX:MaxMetaspaceFreeRatio
-XX:MaxMetaspaceFreeRatio表示GC之后,最大的Metaspace剩余空间容量的百分比,目的是控制减少为释放空间所导致的垃圾收集。默认值为70,这个参数和上面的参数基本是相反的,是为了避免触发metaspaceGC的阈值过大,而想对这个值进行缩小。这个参数在GC之后committed的内存比较小的时候并且离触发metaspaceGC的阈值比较远的时候才进行调整。
5)-verbose
-verbose通过这个参数可以获取类型加载和卸载的信息。
那么元空间这些内存是怎么来管理和分配或者说回收的呢?元空间的内存管理是由元空间虚拟机来管理,通常说的一个元空间是指一个类加载器的存储区域,当然所有元空间合在一起就称之为元空间,以前对于类的元数据需要不同的垃圾回收器来进行处理,但现在只需要执行虚拟机的C++代码即可以完成,并且类和其元数据的生命周期与类加载器是相同的,如果类加载器还是存活的话,那么类的元数据也是存活的,这个时候是不会被回收。当一个类加载器被垃圾回收器标记为不再存活时,其对应的元空间就会被回收。
元空间虚拟机负责元空间的分配,其采用的形式为组块分配,组块的大小因类加载器的类型而异,在元空间虚拟机中存在一个全局的空闲组块列表,当一个类加载器需要一个组块时,它就会从这个全局的组块列表中获取,并不断的维持一个属于自己的组块列表,当类加载器不再存活时,这个组块也就会被释放,并返回给全局组块列表,类加载器拥有的组块会被分成很多个块,每个块存储一个单元的元信息,组块中的每个块是线性分配的,组块分配自内存映射区域。这些全局的虚拟内存映射区域以链表形式连接,一旦某个虚拟内存映射区域清空,这部分内存就会返回给操作系统。
如果需求监控Metaspace元空间的信息,可以使用JDK自带的一些工具来展示Metaspace的详细信息:
- 针对Metaspace,JDK自带的一些工具做了修改来展示Metaspace的信息:
- jmap-clstats:打印类加载器的统计信息(取代了在JDK8之前打印类加载器信息的permstat)。
- jstat-gc:Metaspace的信息会被打印出来。
- jcmdGC.class_stats:这是一个新的诊断命令,可以使用户连接到存活的JVM,转储Java类元数据的详细统计。
相关推荐
- 远程桌面管理服务器的软件工具:Splashtop
-
通过远程控制和维护服务器,IT运维无需亲自在设备附近就可以轻松完成工作,极大地提高了效率。在本文中,我们将深入了解远程桌面管理服务器的主要优点,以及实现此任务所需的软件工具和操作方法。首先,远程桌面管...
- 最担心的事还是发生了 19岁黑客远程破解逾25台特斯拉
-
近日,德国19岁的安全研究人员大卫·科伦坡(DavidColombo)表示,他在特斯拉的系统中发现一处系统漏洞,并通过该漏洞远程入侵了13个国家的25辆特斯拉电动汽车,使其关闭安全系统。他几乎掌控了...
- 朝鲜黑客使用已知恶意软件家族FASTCash的 Linux 变种来窃取资金
-
据观察,朝鲜威胁组织使用已知恶意软件家族FASTCash的Linux变种来窃取资金,作为以财务为动机的活动的一部分。一位自称HaxRob的安全研究员表示,这种恶意软件“安装在受感染网络内处理卡...
- Phorpiex恶意脚本卷土重来,成为LockBit 3.0勒索木马传播载体
-
IT之家5月5日消息,安全公司Cybereason发文透露“老牌”恶意脚本Phorpiex近日又卷土重来,成为传播LockBit3.0勒索木马的载体,感染了相应脚本的设备会自动下...
- 黑客远程入侵控制Jeep 自由光 互联网汽车存隐患
-
当我们在为汽车互联网技术带来的便捷欢呼雀跃时,也许危险也在悄悄走近。近日据Wired报道,名叫安迪的男子正开着Jeep自由光以70码的时速行驶在圣路易斯下城区时,车辆突然失去了控制。“首先是冷风突然调...
- 警惕!KeePass密码管理器竟成黑客“帮凶”
-
近日,网络安全领域爆出一则令人震惊的消息:网络安全公司WithSecure披露,在过去至少八个月的时间里,黑客通过篡改知名的KeePass密码管理器,上演了一场大规模的恶意攻击大戏!KeePass作...
- 开源网页应用框架ThinkPHP遭黑客滥用,变身远程代码执行工具
-
IT之家6月9日消息,安全公司Akamai近日发布报告,声称目前有黑客滥用一款热门开源网页应用框架ThinkPHP中的远程执行代码漏洞,打造了一款名为“Dama”的恶意工具进行攻击。I...
- 远程控制、窃密、挖矿!我国境内捕获“银狐”木马病毒变种
-
最近大家可得小心电脑病毒了!国家相关部门刚通报了一个叫"银狐"的木马病毒新变种,专门盯着普通老百姓和企事业单位下手。我给大家掰开揉碎了讲讲,遇到这种情况该怎么躲坑?·一、这病毒怎么盯上...
- 6款Linux常用远程连接工具,你最中意哪一款?
-
点击上方头像关注我,每周上午09:00准时推送,每月不定期赠送技术书籍。本文2106字,阅读约需6分钟Hi,大家好。远程连接的实现方法有很多,概括地说有两种,一种是用系统自带的远程连接,另外一种是用...
- 安全公司曝光黑客山寨杀毒软件Bitdefender官网,实为提供木马
-
IT之家5月31日消息,安全公司DomainTools发文,透露有黑客伪造网站声称提供杀毒软件,实则借机传播恶意木马。IT之家参考相应通报获悉,相应黑客首先建立山寨Bitdefender...
- 魔兽世界怀旧服:mc与bwl高手进阶输出手法与职业心得理解
-
作者:NGA-499917309a前言:之前写了两篇教新手术士怎么打mc和bwl的帖子,属于基础入门,只是让大家会打,随着时间推移,副本早已进入farm阶段,新手也不满足于会打,而是追求更高的输出,甚...
- 《奇幻梦境》进不去游戏解决方法攻略
-
奇幻梦境第一章近日发售了,本作也是一款第一人称解密游戏。本作的游戏画面色彩简单明了,包括了游戏的剧情也是。有不少的小伙伴反映奇幻梦境打不开不进不去,接下来小编就给大家解决这款游戏打不开进不去的一些可能...
- 国外网友热议:LOL客户端仍然如此差劲!新版又在测试了?
-
印象中英雄联盟的客户端换过几次版本,但是动作最大的应该就是在2017年的那次,直接更换了整个客户端的UI界面以及内部的很多组件。但是新版客户端上线至今两年多的时间里,玩家对于这个客户端的吐槽依旧很多,...
- 谷歌地球免费专业版7.1.5.1557下载
-
IT之家讯5月22日消息,谷歌地球专业版GoogleEarthPro已经更新到7.1.5.1557版,目前,谷歌官方还没有给出更新日志。这种情况通常来讲都是常规问题修复,建议新老用户及时下载安装...
- 僵尸部队三部曲 免安装中文硬盘版下载发布
-
【游戏封面】中文名称:僵尸部队三部曲游戏名称:ZombieArmytrilogy游戏类型:第三人称射击游戏制作:Rebellion游戏发行:Rebellion游戏发行:PC游民星空狙击精英3专区版...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 远程桌面管理服务器的软件工具:Splashtop
- 最担心的事还是发生了 19岁黑客远程破解逾25台特斯拉
- 朝鲜黑客使用已知恶意软件家族FASTCash的 Linux 变种来窃取资金
- Phorpiex恶意脚本卷土重来,成为LockBit 3.0勒索木马传播载体
- 黑客远程入侵控制Jeep 自由光 互联网汽车存隐患
- 警惕!KeePass密码管理器竟成黑客“帮凶”
- 开源网页应用框架ThinkPHP遭黑客滥用,变身远程代码执行工具
- 远程控制、窃密、挖矿!我国境内捕获“银狐”木马病毒变种
- 6款Linux常用远程连接工具,你最中意哪一款?
- 安全公司曝光黑客山寨杀毒软件Bitdefender官网,实为提供木马
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)