JVM内存管理基本知识
这篇本来是想好好写的,今天看了一天了的,可是,组会好像有种要悲剧的感觉啊。。暴风雨前的宁静,尽量记录一些吧。 上周把爬虫代码优化后,就哈皮哈皮的和未优化的版本一起跑了。起初,由于未优化的版本已经run了几天了,内存占用在200M多,而发现优化后的内存占用只有40M,所以很开心。但是不久就发现,优化后的版本,内存占用也会慢慢增加,大有一种“老娘给你分多少,你就要用多少”的赶脚。 用jprofiler监控,自己开发的类的对象数量都比较正常,所以决定学习一下JVM内存管理相关的东西。 JVM主要管理两种类型的内存:堆(Heap)和非堆。 按照官方的说法:“Java虚拟机具有一个堆, 堆 是 运行时 数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。” “在JVM中堆之外的内存称为 非堆 内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到