JAVA应用 占用内存分析

Java应用压测中的内存与CPU占用分析及其优化实践 在大规模系统性能测试(压测)过程中,对Java应用程序的内存使用情况和CPU占用率的深入理解与精准分析至关重要。本文旨在探讨如何通过科学的方法和实用的工具对Java应用在高并发场景下的内存及CPU资源占用进行细致剖析,并辅以实际代码示例,以助于发现潜在瓶颈,优化系统性能。在此环节,我们可以引入具体的代码片段,比如一个存在内存泄露嫌疑的类实例化过程,或是某个计算密集型方法的优化前后对比,以此生动展示如何通过调整算法、减少同步锁或其他方式降低CPU占用率,以及如何通过合理的内存管理防止内存泄露。 阅读详情

转自这里,感谢原作者分享


Eclipse崩溃,错误提示:
MyEclipse has detected that less than 5% of the 64MB of Perm 
Gen (Non-heap memory) space remains. It is strongly recommended
that you exit and restart MyEclipse with new virtual machine memory
paramters to increase this memory.   Failure to do so can result in
data loss. The recommended Eclipse memory parameters are: 
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
 
1.参数的含义
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了
-Xms128m JVM初始分配的堆内存
-Xmx512m JVM最大允许分配的堆内存,按需分配
-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。


1)堆(Heap)和非堆(Non-heap)内存


 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
 可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,
 所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 


堆内存分配


 JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。 


非堆内存分配


 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关,
 -server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有实验。)
 上面错误信息中的PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。还没有弄明白PermGen space是属于非堆内存,还是就是非堆内存,但至少是属于了。
XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。 
说说为什么会内存益出: 
(1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。 
(2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。
  这种错误常见在web服务器对JSP进行pre compile的时候。  


2)JVM内存限制(最大值)


 首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
 这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
 通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:
1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,
 如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
 那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:
参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机,
在eclipse.ini文件中要写成这样:
-vm 
C:/Java/jre1.6.0/bin/javaw.exe 
-vmargs 
-Xms128M 
-Xmx512M 
-XX:PermSize=64M 
-XX:MaxPermSize=128M 
实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。
另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
-vmargs 
-Xms40m 
-Xmx256m 
其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,
而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

4. 其他的启动参数。 如果你有一个双核的CPU,也许可以尝试这个参数:
-XX:+UseParallelGC
让GC可以更快的执行。(只是JDK 5里对GC新增加的参数)

补充:
  如果你的WEB APP下都用了大量的第三方jar,其大小超过了服务器jvm默认的大小,那么就会产生内存益出问题了。
解决方法: 设置MaxPermSize大小 
可以在myelipse里选中相应的服务器比如tomcat5,展开里面的JDK子项页面,来增加服务器启动的JVM参数设置:
-Xms128m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256m
或者手动设置MaxPermSize大小,比如tomcat,
修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行: 
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存

医疗影像分析实战:肺炎X光片分类与分割 医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。 阅读详情

相关推荐

海康工业相机使用:常见问题及解决方法

工业相机在使用过程中,经常会因为操作不当、使用环境不当等原因出现一些问题,本篇教程,主要针对海康工业相机常见问题及其定位方法做以简单介绍,希望可以帮助大家。 注:该教程对其他品牌工业相机“常见问题”排查,也具备一定的指导意义。 当出现无法通过客户端发现设备或者无法预览图像等问题,先确认当前的运行环境是否满足以下要求: 确认装有相机驱动软件的电脑网卡为千兆网卡(Gige接口相机); 确认网卡是否已开启巨型帧; 确认电脑与网口相机之间的网络链路为千兆; 确认装有相机驱动软件的USB接口为3...

Cche的博客 3万+

javaw.exe占用大量内存无法启动eclipse的解决方法

javaw.exe占用大量内存,居高不下,1,eclipse.ini配置一下.2G内存, 配置成为-Xms512m-Xmx512m(或更大). 2,eclipse加载的工程的多少与大小也是一个问题,如果加载workspace非常多,或是非常大,需要把workspace里面的.metadata文件夹删除,以免加载太多,启动不成功。 网络上的解决方案,供参考。 百度、google搜索,一般的解...

东南草堂 1885

转录组数据提取技巧汇总

数据整理是数据分析的前提,而数据的正确提取则是数据整理的前提。

zfyyzhys的博客 1784

Windows java.exe 内存暴涨分析与解决、ldea跑 java \ tomcat 内存无限增长

最近突然遇到个问题:用idea 跑 Tomcat 服务,不到30分钟 内存就吃完了。用任务管理器查看,发现java.exe占了10G内存!! 查了各种方法 〇、 idea Tomcat 配置 没用!!! 一、ideaidea64.exe.vmoptions 安装目录下的 bin 下的 idea64.exe.vmoptions 配置,还是C:\Users\Admini...

亲测,只为展现最完美的有效! 6530

Cocos Creator 2.4 APK逆向实战:如何完整提取游戏资源并还原工程(附工具包)

本文详细介绍了针对Cocos Creator 2.4打包的APK进行逆向工程的完整流程,包括环境搭建、资源索引解析、打包文件提取、图集拆分以及工程结构还原。重点讲解了如何利用config.json和.jsb文件完整提取游戏资源,并生成可被Cocos Creator识别的工程目录与.meta文件,最终实现工程还原的目标。

h3i4j的博客 1495

了解随机振动疲劳分析中 Ansys nCode DesignLife 的平均应力校正

通过选择静态环境,我们可以将其结果视为疲劳计算的平均应力,如图 3 所示,因此从静态偏移载荷工况中提取的平均应力用于转移预测雨流计数中所有循环的平均值。您可以通过观看下面的教学视频获得宝贵的见解,该视频将指导您完成利用 Ansys nCode DesignLife 分析平均应力对随机振动载荷下结构的影响的过程。它基于 R 比率或平均应力水平。另一方面,平均应力校正可以帮助消除平均应力的负面影响,提高结果的保真度。Ansys nCode 提供先进的平均应力校正技术,使工程师能够考虑平均应力对疲劳寿命的影响。

jkh920184196的博客 1519

聊聊Java中的内存

JVM的内存 先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8) 那么一个Java进程最大占用的物理内存为: Max Memory = eden + survivor + old + String Constant Pool + Code cache + compressed class space + Metaspace + Thread st...

芒果不是程序猿v: 的博客 687

5QI(5G QoS Identifier)

此外,5QI与网络切片(Network Slicing)密切相关,网络切片允许网络运营商在物理网络内部创建虚拟网络,为不同的客户和用例提供定制化服务和QoS。5QI(5G QoS Identifier)在5G网络中用于标识不同的服务质量要求,它允许网络对不同的数据流进行优先级划分和资源分配。:5QI的实施需要对5G网络的QoS参数有深入的理解,包括延迟、吞吐量、数据包丢失率等,这对技术人员提出了较高的要求。不是所有的5G设备都支持5QI的全部功能,这可能会限制5QI应用的广泛性。

记录有价值的内容 6536

为什么jvm启动时,参数Xms指定的内存大小没有被占用

JVM参数设置为 -Xms4g -Xmx4g 最大堆内存和最小堆内存都设置了4G,但是为什么java进程占用的实际物理内存却没有占用4个G,却是随着进程的运行,不断的增长,直到触发FullGC,并且发生完FullGC之后,Java进程的内存却没有随之变小? 问题1:为什么参数Xms指定的内存大小没有被占用 原因:JVM在启动前会向操作系统申请内存, 注意这个内存是虚拟内存,如果-Xms设置的过大,超过了操作系统可分配的内存上线,就会启动失败,报下面的异常 Error occurred during init

蒙牛真好的博客 5664

一口气看完TransformerXL详细解释带代码一:相对位置编码

相对位置编码(Relative Position Encoding)是Transformer模型中用于捕捉序列元素间相对位置关系的一种方法,与绝对位置编码(如BERT中的固定位置嵌入)不同,它直接建模元素之间的相对距离,从而更灵活地处理长序列或不同长度的序列。1. 为什么需要相对位置编码?​。

m0_73426548的博客 1427

服务器centos上安装IC618(virtuoso)教程

只需要按照提供的步骤即可实现IC618安装。有需要详情请联系QQ:563962386

swicthsober的博客 1万+

为什么jvm启动时,参数Xms指定的内存大小没有被完全占用

例如启动时设置-Xms4g,但是jvm启动后在资源管理器中

花果山 4142

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java应用程序内存占用分析

本文系统梳理了Java程序内存优化的关键知识。首先解释了Java程序内存占用本质是JVM进程使用的物理内存(RSS)和虚拟地址空间,包含堆、栈、方法区等区域。详细剖析了JVM运行时数据区的划分:堆(对象实例)、方法区(类元数据)、虚拟机栈(方法调用)、本地方法栈、程序计数器和直接内存,并对比了各区域的特性和异常情况。特别区分了Java内存区域(物理内存划分)与Java内存模型;(线程间通信规范)两个易混淆概念。

chanalbert 1605

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Java进阶】Java应用内存与CPU占用场景深度分析

Java应用内存与CPU占用分析摘要 本文深入分析了Java应用中的内存与CPU高占用场景。内存方面,探讨了堆内存溢出、元空间溢出等典型问题,列举了静态集合持有对象、未关闭资源等内存泄漏模式,并介绍了jmap、MAT等诊断工具。CPU方面,解析了算法复杂度高、频繁GC等导致CPU飙升的原因,展示了死锁、正则回溯等代码示例,推荐了jstack、Arthas等诊断方案。最后提供了内存优化(JVM参数调优、对象池化)和CPU优化(算法改进、线程池调优)的实践策略,以及GC调优等实战技巧。全文通过图表和代码示例,系

wendao76的专栏 1171

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java应用占用内存和CPU分析

java应用占用内存和CPU分析起源与动机 起源与动机 在生产中突然发现某java应用程序的cpu或者内存占比较高,除了利用JDK自带的jconsole与jvisualVM以外,可以在linux下用命令实现查看。 #分析步骤 找到目标程序; 1.如果知道应用程序的名称 1)ps -ef | grep “程序名称”;//查到PID 2.不清楚应用程序的名称 2)top //查看所有进程...

竹林小屋的博客 1733

java应用内存res高_Java应用Top命令RES内存占用高分析

ps aux命令执行结果的几个列的信息的含义USER 进程所属用户PID 进程ID%CPU 进程占用CPU百分比%MEM 进程占用内存百分比VSZ 虚拟内存占用大小 单位:kb(killobytes)RSS 实际内存占用大小 单位:kb(killobytes)TTY 终端类型STAT 进程状态START 进程启动时刻TIME 进程运...

weixin_39585617的博客 2434

一次java应用内存占用分析

发现展示的内存占用更多了,总占用的335M和第二步中的360M已经很接近,而第三步的157M约等于java heap和class之和,除此之外主要还包含thread的内存,上图中#143表示线程数,默认一个线程1M(图中的线程占用被修改成了228K)(2)执行jcmd 24417 VM.native_memory scale=MB。得到进程pid是24417,同时能看到设置的最大堆内存是100M。可以算出整个java进程大约占用360M,发现一个问题,(1)top(可按shift+M按内存排序)

liujevon1212的博客 998

top res mysql_Java应用Top命令RES内存占用高分析

ps aux命令执行结果的几个列的信息的含义USER 进程所属用户PID 进程ID%CPU 进程占用CPU百分比%MEM 进程占用内存百分比VSZ 虚拟内存占用大小 单位:kb(killobytes)RSS 实际内存占用大小 单位:kb(killobytes)TTY 终端类型STAT 进程状态START 进程启动时刻TIME 进程运...

weixin_29367131的博客 1275

LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

本文转载 线上应用故障排查之一:高CPU占用DBA+社群(dbaplus)丁启良 1. 应用程序占用资源高问题 目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某个JAVA程序占用的CPU,内存过高,而且几乎从不释放,导致系统卡顿,用户使用变慢,如果要恢复,则必须杀掉该进程或重启该服务,然后进行此操作时,必定会导致业务中断。 程序主要由代码组成,优化则需要知...

weixin_30906425的博客 120

java内存使用情况分析_java应用占用内存过高排查的解决方案

故障:收到服务器报警,内存使用率超过80%1.查看使用dstat和top查看内存使用最高的应用使用dstat查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况使用top可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存2.定位线程问题使用ps查看16494的线程情况命令:p...

weixin_39929566的博客 1589

JAVA应用CPU占用100%|内存泄漏分析总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34019929的博客 343

linux java 内存排序_LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

1. 应用程序占用资源高问题目前大部分应用程序采用的是JAVA语言开发,在产品上线使用一段时间后,经常会出现某个JAVA程序占用的CPU,内存过高,而且几乎从不释放,导致系统卡顿,用户使用变慢,如果要恢复,则必须杀掉该进程或重启该服务,然后进行此操作时,必定会导致业务中断。程序主要由代码组成,优化则需要知道是哪段代码占用资源,并且一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出...

weixin_39517199的博客 178

java进程cpu内存利用率高_JAVA应用程序占用CPU、内存过高分析过程

1.查看cpu占有率top -P2.查看进程cpu占用率ps -mp 3749 -o THREAD,tid,time|sort -rn|head -n 20查看占用cpu高,且占用时间长的线程$.线程ID转换为16进制格式printf "%x\n" tid3.查看java堆栈信息su - nobody -c "/usr/java/jdk1.6.0_21/bin/jstack 3749|grep 3...

weixin_30444697的博客 646

如何Dump当前Java应用的内存结构,并进行分析找到占用空间最大的Class

引言:在Java应用中,对于内存的占用是一个让人头疼的问题,那在我们怀疑内存占用出现问题时,如何找到我们想要的答案,比如哪个占用了最多的内存,本文讲尝试给出一个思路。

木小鱼的笔记 1万+
上一篇: 关于禁用编译Kernel 是warning as a error
下一篇: android jitsi编译及运行
勤奋专注
博客等级 码龄19年 80粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值