windows查看java堆内存命令 windows查看jvm内存大小

admin2024-06-04  14

cmd进入控制台,进入jdk的bin目录,执行jps命令查看java进程的pid,执行jmap -heap -pid 查看jvm信息

D:\Java\jdk1.8.0_191\bin>jps
4948
808 Jps

D:\Java\jdk1.8.0_191\bin>jmap -heap 4948
Attaching to process ID 4948, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:									//堆内存初始化配置
   MinHeapFreeRatio         = 0						//堆最小空闲比率
   MaxHeapFreeRatio         = 100					//堆最大空闲比率
   MaxHeapSize              = 1258291200 (1200.0MB)	//堆最大大小
   NewSize                  = 13631488 (13.0MB)		//堆新生代的默认大小
   MaxNewSize               = 419430400 (400.0MB)	//堆新生代最大大小
	   OldSize              = 28311552 (27.0MB)		//老年代大小
   NewRatio                 = 2						//新生代和老年代的大小比率
   SurvivorRatio            = 8						//年轻代的eden区与survior区的大小比率
   
   MetaspaceSize            = 21807104 (20.796875MB) //取代了老年代permSize,初始20.8MB,逐渐扩容达到配置的大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB    
   G1HeapRegionSize         = 0 (0.0MB)


                     
Heap Usage:													//堆内存使用情况
PS Young Generation											//年轻代
Eden Space:													//Elden区
   capacity = 256901120 (245.0MB)							//总大小
   used     = 164015872 (156.417724609375MB)				//已使用
   free     = 92885248 (88.582275390625MB)					//剩余
   63.843969228316325% used									//已使用百分比
From Space:													//elden区中的一个serviour区
   capacity = 74448896 (71.0MB)
   used     = 0 (0.0MB)
   free     = 74448896 (71.0MB)
   0.0% used
To Space:													////elden区中的另外一个serviour区
   capacity = 72351744 (69.0MB)
   used     = 0 (0.0MB)
   free     = 72351744 (69.0MB)
   0.0% used
PS Old Generation											//老年代									
   capacity = 214958080 (205.0MB)
   used     = 146514984 (139.72757720947266MB)
   free     = 68443096 (65.27242279052734MB)
   68.15979376071837% used

71292 interned Strings occupying 12377392 bytes.

D:\Java\jdk1.8.0_191\bin>

PS1 : JDK8+移除了Perm,引入了Metapsace,它们两者的区别是什么呢?

无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,随着类加载越来越多不断扩容调整,直到MetaspaceSize(如果没有配置就是默认20.8m)触发FGC,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大。
而Perm的话,我们通过配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据-XX:PermSize初始化分配一块连续的内存块,这样的话,如果-XX:PermSize设置过大,就是一种赤果果的浪费。很明显,Metapsace比Perm好多了;

PS2: jvm内存模型

windows查看java堆内存命令 windows查看jvm内存大小,windows查看java堆内存命令 windows查看jvm内存大小_windows查看java堆内存命令,第1张

程序计数器(线程私有)

每条线程都有一个独立的程序计数器,这类内存也称为“线程私有”的内存。正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果是Native方法,则为空。

java 栈(线程私有)

也是线程私有的。每个方法在执行的时候也会创建一个栈帧,存储了局部变量,操作数,动态链接,方法返回地址。
每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。通常所说的栈,一般是指在虚拟机栈中的局部变量部分。局部变量所需内存在编译期间完成分配,如果线程请求的栈深度大于虚拟机所允许的深度,则StackOverflowError。如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则OutOfMemoryError。

本地方法栈(线程私有)

和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。也会抛出StackOverflowError 和OutOfMemoryError。

堆(线程共享)

被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例。
对可以按照可扩展来实现(通过-Xmx 和-Xms 来控制)当队中没有内存可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

方法区(线程共享)

被所有方法线程共享的一块内存区域。
用于存储已经被虚拟机加载的类信息,常量,静态变量等。
这个区域的内存回收目标主要针对常量池的回收和堆类型的卸载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!