JVM-java内存
续 JVM(java 虚拟机)一 这里继续对java做深入的理解。
从(一)中说明了JVM就等同于操作系统,我们在学习操作系统的时候就会理解内存,那么JVM也有内存处理吗?
其实每个单独java程序都会启动一个JVM,同时也指定JVM的内存大小,所以如果程序太大,就会报错“java.lang.OutOfMemoryError”。
有事我们在运行Tomcat中的web程序就会出现这个原因,因为Tomcat默认也是使用的是JVM默认的内存,一般是物理内存的1/4,所以如果是
4G的物理内存,JVM默认最大的使用内存是1G,超过1G就会报错。也许我们在用Eclipse的时候,也会起动JVM,我们可以看配置文件
eclipse.ini中有
-Xms40m -Xmx512m
这个也就是代表我们在起动eclipse的时候默认启动内存是40M,最大内存512M,所以我们的eclipse的内存就运行在之间。配置JVM一般有四个参数:
-Xmx Java Heap最大值,默认值为物理内存的1/4, 最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值, 开发测试机JVM可以保留默认值; -Xmn Java Heap Young区大小,不熟悉最好保留默认值; -Xss 每个线程的Stack大小,不熟悉最好保留默认值;我们可以在命令行中来设置运行JAVA的JVM信息。
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test 这里的Test就一个科=可运行的class文件当然如果用eclipse运行,也可以配置,如下图:
所以JVM的启动都会有相应的内存指定。
其实-Xmx的配置不是可以无限的设置的,除了本机的内存还与系统有关,可以参考jvm在不同系统中的最大内存空间地址 比如在windows下2G的内存最多把-Xmx1500M左右,其实我们一般写的程序1G的最多空间以足以,空间越大,垃圾回收就用时了,所以按照自己配置-Xmx。
配置不多说,前面有两个-Xmn、-Xss还不知道是是么?那我们就看一下JVM有哪些分类。我们学过操作系统,内存都有很多分类寄存器、RAM、ROM、DRAM……到目前我还是没有分清楚,那么JVM也有内存分类吗?
其实JVM也有五个地方可以存储数据。
一、寄存器,这里是最快的,我们都知道这个是CUP中的存储区域,当然最快。但我们写JAVA程序就不能控制寄存器,也感觉不到她的存在(c、c++是可以的)。所以在我们编程中与它的关系不大,不过它的确存在。
二、堆栈,存储java的一些特殊的对象。
三、堆,存储我们new的对象,所说的垃圾回收,应该就是处理这个堆把。
四、常量存储(不懂)
五、非RAM存储(不懂)
ok,内存值得学习,一下,继续研究。