学到jvm一头雾水,不知道是干啥用的。后来度娘了一下,有点了解了,大概意思就是说用java编写的源代码,要经过jdk这个工具进行编辑,编译成java虚拟机可以识别的语言,才可以运行。初步了解是这么个意思。
jvm是java程序运行的环境,有自己运行的生命周期
想要了解jvm和内存溢出有什么关系,先了解一下什么是内存溢出
内存溢出:就是你要求分配的java虚拟机的内存超出了系统给你的,系统不能满足,所以溢出。
内存泄露:指你向系统申请的分配的内存进行使用,可以使用完了又没有进行归还,没有delete,结果被申请分配的那块内存自己也不能再访问,无法再被重新使用,随着服务器不断的消耗内存,会产生无法使用的内存会越来越多,系统也不能将他在分配给其他的需要程序去使用,产生内存泄露,一直下去,程序无内存使用,就会产生内存溢出。
sun jdk遵照jvm规范,将内存划分为方法区、堆、jvm方法栈、本地方法栈和pc寄存器
方法区:存放要加载的类和接口的信息,static变量、常量、通过class对象获取的相关数据,这块区域成为持久带,默认最小值16mb,最大值64mb,可通过-xx:permsize 及 xx:maxpermsize 来设置最大值和最小值
堆:heap memory,存放实例和数组值,heap中的对象所占用的内存由gc进行回收,在32位系统中最大为2G,64位系统大小无限制,可通过-xms 和-xmx控制,-xms是jvm启动时申请的最小的heap内存,-xmx是jvm可申请的最大的内存。
方法栈:每个线程都对创建pc寄存器和方法栈,方法栈为线程私有,放方法运行完毕后,该方法的站贞所占用的空间会自动释放,方法栈空间不足,可通过-xss进行设置
新生代由伊甸园区和两个大小相同的survivor space构成,可通过-xmn制定新生代的大小,
对象由新生代创建,在伊甸园区进行存放数据,当伊甸园区满了的时候,jvm垃圾回收器对其进行回收,不被使用的对象将对其进行销毁,仍然被使用的对象转移到s0区,s0区满后,转移到s1区。
旧生代中存放经过多次垃圾回收后仍然被使用存活的对象,例如缓存对象,占用大小为,xmx值-xmn的值