java内存使用情况
❶ java内存占用大堆内存少
首先java内存可以大体分为堆内存和栈内存。一般收的内存使用过大是指堆内存使用过大。一般分步骤分析。
现在内存过大到底到何种程度。是否引起了GC或者FUll GC。是否影响了正常工作。
1.明白现在内存有多大,可以通过工具看,和使用的内存比例。如果项目中需要缓存很多缓存,孙耐可以理解使用是合理的。如果服务器内存够大,应用可以适当调整XMX xms参数进行JVM调整。者帆
2.如果系统中没有使用缓存,和大对象内存过高,那就考虑是否有内存泄漏。可以使用jmap等jVM调优工具进行对象分析。然后定位过高原因修改代码。
jmap -mp:format=b,file=文件名 [pid]
mp当前系统,根据mp文件我们可以分析当前系统中存在的内存问题。
分析mp文件的工具很多,JDK自带的Jhat,Eclipse也有相关的插件。
我使用的是Eclipse Memory Analyzer,功能很强大,能够生成各种报表,另外可以在不同的时间生成不同的mp,然后通过工具分析两个mp的内存变化。
大家专注我,我写了好多JVM 原理和调优的文章。
文版权归是三僡然所有,转载请标明出处。欢迎转载,欢迎评论首凯雹,欢迎分享。如果你有文章想分享可以联系我。
❷ java 如何获得一个进程的内存使用情况,cpu运行的时间
首先有个基本问题需要了解一下:
这里所说java里获得一个进程的内存使用情况和cpu运行时间,是指在java内部获取一个纯外部进程的内存与cpu时间呢,还是指在java内部,由java启动的进程的内存与cpu时间。
如果是第一种情况,那你还需要在java内部再起一个进程,通过执行操作系统的shell命令来查看那个进程的运行状态。比如那个外部进程的ID为3119,则执行cat /proc/3119/status | grep VmRSS就可以过滤出该进程的物理内存占用量。
如果是第二种情况,(假定你问的就是这种情况)。
先说内存占用量:一般说来,你可以使用这两种方式获取内存使用情况
方式一:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); //椎内存使用情况
long totalMemorySize = memoryUsage.getInit(); //初始的总内存
long maxMemorySize = memoryUsage.getMax(); //最大可用内存
long usedMemorySize = memoryUsage.getUsed(); //已使用的内存
方式二:
Runtime rt = Runtime.getRuntime();
long totalMemorySize = rt.totalMemory(); //初始的总内存
long maxMemorySiz = t.maxMemory(); //最大可用内存
long freeMemorySize = rt.freeMemory(); //当前可用内存
需要说明的是,这种方式获取的是整个jvm的内存使用情况,并不是某一个进程的内存使用情况,事实上,在java内部,可以使用Rumtime.getRuntime().exec(${SHELL})来开启一个外部进程(这里${SHELL}代表一个可操作系统的shell命令)。而运行Java程序整个jvm,对于操作系统而言,也仅仅只是一个进程。也就是说,一个jvm就是一个进程,你通过java程序开启的进程都是外部进程,java内部目前还提供了一个destroy方法来销毁该进程,对于该进程的其它信息,都无法直接获取,这些信息的获取,显然需要本地化(Local)的实现。既然标准jdk库没有,就不可能再通过平台无关的代码来实现了。典型的做法就是使用前面第一种情况的方式,再启一个进程,执行shell命令来获取。
不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime(); //当前线程的cpu使用时间
long someThreadId = 709817L; //假定有某个线程的ID是709817
② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId); //获取ID为someThreadId即709817的线程的cpu时间
基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式来获得进程的cpu使用时间。
❸ Java获得内存使用,磁盘情况
迟孝import java io File;
/**
*
* jdk 下的磁盘使用情况例子
*/
public class Diskfree {
public static void main(String[] args) {
File[] roots = File listRoots();//获取磁盘分区列表
for (File file : roots) {
System out println(file getPath()+ 信息如下: );
System out println( 空闲未使用 = + file getFreeSpace()/ / / + G );//空闲空间
System out println( 已经使用 = + file getUsableSpace()/ / / + G );//可用空间
System out println( 总容量 = + file getTotalSpace()/ / / + G );//总空间
System out println();
}
}
}
java获得当前系统内存情况的代码如下
Java code
import java lang management ManagementFactory;
import sun management OperatingSystemMXBean;
public class OSTest {
public static void main(String[] args)
{
OperatingSystemMXBean o *** b = (OperatingSystemMXBean) ManagementFactory getOperatingSystemMXBean();
System out println( 系统物理内存总计 + o *** b getTotalPhysicalMemorySize() / / + MB );
System out println( 系统物理可用内存总计 + o *** b getFreePhysicalMemorySize() / / + MB ); }
}
ManagementFactory getOperatingSystemMXBean()返回的是java lang management里面的OperatingSystemMXBean
我们要用的是 sun management OperatingSystemMXBean;
在java类库中可颂凯以查到
public abstract Interface sun management OperatingSystemMXBean extends java lang management OperatingSystemMXBean
所以我们可以强制转换一下
想得到磁盘使用情况的话 可以看 楼的例子 要得到系统信息的话 使用System getProperty(String key);
方法
内存使野旦唤用可以使用Runtime getRuntime() getTotalMemory() Runtime getRuntime() getFreeMemory()
纯JAVA是不能同操作系统打交到得 比如你要看CPU使用率 一般就是使用JNI技术(一些简单得系统熟悉 可以通过System getProperties()获得)
lishixin/Article/program/Java/hx/201311/27126
❹ 发布即巅峰!万字长文:Java性能调优六大工具:MAT内存分析工具
MAT内存分析工具,简称MAT,是一种功能强大的Java堆内存颂睁分析器。它可以帮助用户查找内存泄漏,查看内存消耗情况。MAT是基于Eclipse开发的一款免费性能分析工具,用户可以在eclipse.org/mat/上下载并使用。
在分析堆快照之前,首先需要导出应用程序的堆快照。可以使用jmap、JConsole和VisualVM等工具获得Java应用程序的堆快照文件,MAT也具备这个功能。在MAT中,通过File菜单的AcquireHeapDump命令,选择要分析的应用程序即可。
除了在MAT中导出正在运行的Java应用程序堆快照,也可以通过File菜单的OpenHeapDump命令打开一个已存在的堆快照文件。MAT可以打开已有的堆快照,也可以直接从活动Java程序中导出堆快照。
在MAT界面右侧,可以查看堆快照文件的大小、类、实例和ClassLoader的总数。饼图显示了当前堆快照中最大的对象。通过饼图,可以在Inspector界面中查看对象的详细信息,也可以对选中的对象进行更多操作。
通过柱状图界面,可以查找引用选中对象的对象集合以及选中对象所引用的对象集合。在MAT中,可以根据对象间的引用关系对内存中的对象进行分析。
浅堆和深堆是两个非常重要的概念。浅堆是指一个对象所消耗的内存,深堆是指对象的保留集中所有对象的浅堆之和。理解这两个概念有助于分析内存使用情况。
支配树是MAT提供的一个对象图,体现了对象实例间的支配关系。在MAT中,可以查看对象支配树视图,了解对象的直接支配者。
垃圾回收根可能是系统类、JNI局部变量、JNI全局变量、线程等。通过MAT,可以列出所有的根对象。
内存泄漏检测是MAT提供的功能之一。通过选择LeakSuspects命令,MAT会自动生成一份报告,罗列系统内可能存在内存泄漏的问题点。
最大对象报告可以帮助开发者找到系统中占用内存最大的几个枝旅对象。通过选择TopConsumers命令,可以打开消耗内存最多的对象的报告。
查找支配者也是MAT的一个功能。通过选择ImmediateDominators命令,可以输出选中对象的直接支配者。
线程分析和集合使用情况分析是MAT提供的其他功能。通过这些功能,可以更好地了解系统的内存使用情况。
扩展MAT可以让它野搭岁更贴近实际生产环境,提高堆内存分析的效率。
❺ jmapmp内存的命令是
jmap命令是查看Java内存信息的工具,其中jmap mp内存的命令是“jmap -mp”。
关于这个命令的详细解释如下:
Jmap是Java的一个命令行工具,用于查看Java应用程序的内存使用情况。它可郑和以生成堆转储快照,以帮助开发人员分析内存中的问题。特别是在解决内存泄漏或者调优JVM时,jmap是一个非常重要的工具。其中,“jmap -mp”命令是用于将JVM的内存转储到文件的。
当使用“jmap -mp”命令时,通常需要指定一些参数来获取特定的内存信息。这些参数包括堆转储文件的输出路径、JVM进程的PID以及可能的选项设置等。通过这个命令,开发者可以获取到关于Java对象的详细信息,包括对象的大小、类的类型以及对象之间的关系等。这对于分析内存中的对象结构以及查找潜在的内存问题非常有帮助。
在实际使用中,为了获取准敏瞎确的内存转储信息,需要确保在执行jmap命令时JVM进程处于稳定状态。此外,对于大型系统的内存转储操作可能会消耗一定的时间和资源,因此在实际操作中需桥丛空要注意对系统性能的影响。
总之,“jmap -mp”命令是Java开发中用于分析内存使用情况的重要工具之一,通过它可以获取到详细的内存转储信息,帮助开发者解决内存相关问题。使用前要确保理解相关参数的意义和操作注意事项,以保证结果的准确性和有效性。