对java运行原理有了个粗鄙的了解后,就对jvm内存的大小产生了兴趣,现进行研究如下:
感觉jvm内存中存储的是.class文件,但印象中.class文件挺大的,毕竟是一整个大项目的工程嘛,而相对的感觉jvm内存的容量比较小,现在实地探查下:
我看了我手头的项目,所有的.class加起来有个150M左右(64.4M+61.0M),而我jvm设置的内存应该是1024M, 这样看来我原先怀疑的内存装不下.class文件是不成立的。
下面经查资料给个查看内存使用情况的方法,
上图是我启动起来我的eclipse项目后根据上述操作显示的内存占用情况;
打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的JRE:
-Xms512M -Xmx1024M -XX:MaxPermSize=512m
a) 堆内存设置:程序可以到达的,可以操作的
-Xms 初始堆内存 默认物理内存1/64,也是最小分配堆内存。当空余堆内存小于40%时,会增加到-Xms的最大限制
-Xmx 最大堆内存分配 默认物理内存1/4,当空余堆内存大于70%时,会减小到-Xms的最小限制。
一般设置 -Xms和Xms大小相等
b) 非堆内存设置
-XX:PermSize 非堆内存的初始值,默认物理内存的1/64 ,也是最小非堆内存。
-XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4。
看来我设置的jvm内存最大1G;这个装.class文件真心够用;至于为啥会显示的1131M,我也不知道,反正不纠结这点;
此外.class有了,class的参数存哪?感觉肯定有个数据寄存器啥的来存储更新传过来的参数;这样根据需要变换传递的参数值啥的进行运行时就可以通过改变寄存器中的数据来实现;
资料中斩钉截铁的说:
Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的(
bootstrap loader)
类装载器所做的工作实质是把类文件从硬盘读取到内存中的;
所以jvm内存必须够装.class文件