JVM的内存划分,jdk7和jdk8是有区别的
先举个例子
JVM所管理的内存空间可划分为:
一个虚拟机栈归属于一个线程,是线程独有的内存空间。当线程消亡的时候,虚拟机栈也就消失了
程序计数器也是线程私有的
HotSpot虚拟机把本地方法栈和虚拟机栈合二为一了
堆内存中的对象会被Java所有的线程所共享
方法区存储的元信息包括常量、Class对象
直接内存不是JVM直接管理的内存
类加载完成的时候,就知道对象的大小了
System.gc()
Jvisualvm
Jconsole
对static 方法加上synchronized关键字是对当前类的Class 对象进行加锁
Jvisualvm和Jconsole都可以监测死锁
元空间的默认大小是21M,如果不够用的话,会进行垃圾回收,它的上限是物理内存的大小
可见一直在加载类
元空间的资料元空间与永久代
JDK8废弃了永久代,引入了元空间。
元空间的调优与工具
jmap
jmap -clstats 4093
jmap -heap 4619
MC:当前元空间的容量 MU:元空间的使用量
查找PID
上面方法不是很好看
下面使用jps
jcmd在列出java进程方面是可以和jps互换的
打印出操作手册
还有个图形化工具叫做jmc,jfr是java飞行记录器的简写
jhat 主要用来做堆转储的分析,还可以用OQL
jvisualvm也有OQL查询
回顾性总结
类型的加载、连接、初始化都是在程序运行期间完成的