当前位置:首页 > 内存 > 正文

java查看对象内存占用

  • 内存
  • 2024-07-04 03:26:15
  • 1624

一、Java里怎么知道一个对象占了多少内存?jconsole:一个ja​​vaGUI监控工具,可以以图形形式显示各种数据。并可以通过远程连接监控远程服务器VM。jmap:显示某个Java进程(使用pid)内存中所有“对象”的状态(例如生成的对象及其数量)。
二、如何查看unix的java内存使用情况jmap(Linux独有,也是非常常用的命令)
观察正在运行的jvm的物理内存使用情况。
参数如下:
-heap:打印jvmheap情况
-histo:打印jvmheap柱状图。输出信息包括类名、对象数量、对象占用大小。
-histo:live:同上,但只允许存活对象
-permstat:打印永久代堆情况
使用命令:
jmap-heap3409
NewGeneration即可观察到的(EdenSpace、FromSpace、ToSpace)、tenuredGeneration、内存使用PermGeneration
输出内容:
jmap-histo3409|jmap-histo:live3409
可以观察堆中所有对象的状态(所有幸存对象的堆情况)。包括物体的数量和占用的空间。
输出内容:
编写一个脚本,可以快速找到占用堆最大的对象,这对于处理内存泄漏特别有效。
如果结果较多,可以使用以下命令将其显示在文本文件中。
jmap-histo3409|jmap-histo:live3409>
jinfo:可以查看和修改正在运行的Java进程的选项。
jps:与Unix中的ps类似,用于显示本地Java进程。可以查看本地运行的多个Java程序并查看其进程号。
jstat:监控VM内存的强大工具。可用于监视虚拟机内存中的不同堆和非堆大小以及内存使用情况。
jmap:显示某个Java进程(使用pid)内存中所有“对象”的状态(例如:生成了哪些对象以及有多少)。
jconsole:一个ja​​vaGUI监控工具,可以以图形的形式显示各种数据。并可以通过远程连接监控远程服务器VM。
详细说明:在使用这些工具之前,首先使用JPS命令获取每个JVM当前的进程号,然后选择要查看的JVM。
jstat工具特别强大,有很多选项可以让你详细地可视化堆的每个部分的使用情况以及加载的类的数量。使用时必须添加要查看的进程ID以及选择的参数。下面详细介绍各个参数的含义。
jstat-classpid:显示加载的类数量、占用空间等信息。
jstat-compilerpid:实时显示VM编译数量等信息。
jstat-gcpid:可以显示gc信息,查看gc次数和时间。最后五项是younggc数量、younggc时间、fullgc数量、fullgc时间和总gc持续时间。
jstat-gccapacity:可以显示VM内存中三代(young、old、permanent)对象的使用情况和占用大小。例如:PGCMN显示perm的最小内存使用量,PGCMX显示perm的最大内存使用量。烫发。使用量,PGC是新生成的永久的内存使用量,PC是之前的永久的内存使用量。其他人可以从这个类比中推断出,OC是前者的纯粹职业。
jstat-gcnewpid:新对象信息。
jstat-gcnewcapacitypid:有关新对象及其占用情况的信息。
jstat-gcoldpid:有关旧对象的信息。
jstat-gcoldcapacitypid:有关旧对象及其占用情况的信息。
jstat-gcpermcapacitypid:授权对象及其占用情况的信息。
jstat-utilpid:统计gc信息。
jstat-printcompilationpid:有关VM执行的当前信息。
除了上述设置外,您还可以同时添加两个号码。例如:jstat-printcompilation30242506每250毫秒打印一次,共6次。您还可以添加-h3以显示标题间隔。三行。
Jmap是一个可以显示内存中所有对象的工具。它甚至可以将VM堆显示为二进制格式的文本。
命令:jmap-dump:format=b,file=
file:保存路径及文件名
pid:进程号
?jmap-histo:livepid|less:堆中活动的对象和大小
?jmap-heappid:显示堆使用信息
jinfo的用途:比较简单,即可以查看和修改Java进程在Duration时的执行参数。用法为jinfo-optpid例如:要显示MaxPerm大小2788,可以使用jinfo-flagMaxPermSize2788。
Jconsole是一个用Java编写的GUI程序,用于监控虚拟机和远程虚拟机。它使用起来非常简单,而且功能非常强大。工作原理:只需在命令行上打开jconsole并选择进程即可。
有关在JConsole中分区内存的说明。
EdenSpace(heap):内存最初分配给该线程池中的大多数对象。
SurvivorSpace(堆):用于将垃圾回收后未被回收的对象保存到edenspace内存池中。
TenuredGeneration(堆):用于将存在于survivorspace内存池中的对象持久化一定时间。
PermanentGeneration(非堆):保存虚拟机自己的静态(反应性)数据,例如类和方法对象。JVM共享此类数据。该区域分为只读和只写,
CodeCache(非堆):HotSpotJava虚拟机包含用于编译和保存本机代码的内存,称为“代码缓存”(codecache)
?jstack(检查jvm线程执行状态,是否有阻塞现象等):jstackpid:threaddump
?jstat-gcutilpid1000100:每1000ms统计gc状态100次;
还有,推荐的内存对象查看jmapdump的MemoryAnalyzer工具