本文共 1171 字,大约阅读时间需要 3 分钟。
栈溢出就是当递归调用的时候没有临界退出条件,批量导入大量数据或者dom4j解析大的xml文件的时候会出堆溢出,通过分段批量提交以及sax代替dom4j;
java虚拟机有一个堆,堆是运行时数据区域所有的类和数组的内存都是从堆里分配的;堆是在java虚拟机启动的时候创建的,两种内存:堆和栈;
堆是java开发人员使用的;栈是jvm自己使用的,内存结构分为:
1. 堆(逻辑上连续的,物理上不是连续的,存的是类实例,和数组), 2. 虚拟机栈(基本的数据类型,引用对象), 3. 本地方法栈(jvm栈是为java方法的执行提供服务,而本地方法栈是为虚拟机为本地方法提供服务的),方法区(持久代)(加载了类的基本信息,常量池的属于方法区的一部分,string就是存在常量池中),计算器(就是来选取要执行下一条字节码的指令)gc垃圾回收机制,动态分配内存的大小,依靠垃圾回收机制来完成对分配内存空间的回收,
从而避免了内存溢出的问题,降低了程序员工作的复杂度,采用了分代回收算法,jvm将内存分为年轻代和年老代,年轻代就是对象刚建立不久,生命周期也很短,而年老代对象创建的比较久了,而且生命周期也很长,对于年轻代, 频繁采用复制算法 ,而年老代比较少采用tracing算法;jvm的内存大小和操作系统有关,一般来说是32位处理器内存为4个g,64为的处理器就不会有有限制了;操作系统会给一个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G)。
java的监视和管理控制台:是我们在运行的时候监视各种jvm资源统计信息,使用与检测死锁,内存遗漏;
可以连接到一个本地或远程的jvm可以用来监视线程的状态,内存的使用情况,垃圾收集等等等jvm的调优:开启server模式,增堆的大小,以及持久代的大小,提高程序的运行效率,
设置初堆大小和最大堆的大小都为一样的值,避免了堆增长带来额外的压力,持久代也是一样jvm中类的生命周期:加载、连接、初始化,使用,卸载
连接(校验,准备,解析)
在服务器启动的时候报内存溢出是因为方法区太小,也就相当于持久代的内存太小。
通过-XX:PermSize以及-XX:MaxPermSize来指定其大小,可以解决这个问题。jvm如何调优?
开启-Server模式,增大堆的大小,以及持久代的大小,从而提高程序的运行效率,并且将初始堆大小和最大堆大小设置为一样的值从而避免了堆增长会带来额外压力。持久代大小的设置同理,也设置为初始大小和最大大小一样大。转载地址:http://wnqqd.baihongyu.com/