Jvm内存分配分析,Java OutOfMemoryError原因分析

这里写图片描述
一.HotSpot虚拟机分析
1.HotSpot官方是32位架构,虚拟机具有自己的指令集,由于java是解释执行的,程序在运行过程中并不是运行机器的机器指令,而是运行虚拟机内部自己的指令集,然后通过不同架构体系的虚拟机运行各个机器平台的的指令集,使Java程序变现为对外的一致性和跨平台性;
2.hotspot内存分为全局区和线程区,全局区分为方法区,主要存储静态变量,代码,常量等在程序运行过程中不需要经常进行处理的数据;堆,是代码在运行过程中对象实例化,变量等分配内存的空间。线程区,Java对外显示为一个进程,在虚拟机内部以多线程并行运行,每个线程均有自己的虚拟机均有自己独立的虚拟机栈,本地方法区,程序计数器,程序计数器就是当前运行的代码的地址。
3.HotSpot虚拟机并不区分本地方法栈和虚拟机栈,因此无法通过-Xoss改变栈的大小,只能通过-xss改变。
4.本地方法栈与虚拟机栈的不同是虚拟机栈为虚拟机执行Java方法服务,本地方法栈则为虚拟机使用到的Native方法。
二.异常分析
1. 当线程的栈的深度大于虚拟机允许的最大的深度就会抛出StackOverflowError异常;
2. 当线程的栈的深度大于虚拟机允许的最大的深度就会抛出StackOverflowError异常;
3. 当申请的栈的内存大于栈的最大内存就会抛出OutOfMemoryError异常
4. 当虚拟机内部的静态常量,代码存储量大于方法区的大小就会抛出OutOfMemoryError:PermGen异常;
5. 当程序申请的动态内存大于堆得最大容量就会抛出OutOfMemoryError:Java heap Space异常;

三.异常解决方法
1.OutOfMemoryError通过-XX参数改变虚拟机内存大小,重启程序来释放内存,检查内存泄露
2.OutOfMemoryError:PermGen通过参数改变大小,清理整个服务端无用代码,重启程序
四.GC内存回收
1.堆内存分为两个区域,分别为eden区和surviour区,两者按照8:2分配;
2.新对象产生的时候会在虚拟机分配内存,按照大部分分配的0.8的eden区和0.1的surviour区,当对象用完后GC机制就会自动回收内存,来释放空间剩下的就会复制带0.1的surviour区(年轻代)和老年代区;
3.年轻代的内存在使用过程中超过一定计数就会进入老年代区,一般为15次;
4.老年代的内存几乎不进行内存回收;
五.内存检测工具
1.java自带了丰富的内存检测工具:Jconsole,jmap,jstack
五.NOI outofmemoryerror
1.在编写Noi程序的时候常常会遇到Java消耗的的内存并不多,但是机器内存溢出的情况,原因是Native程序并不运行在虚拟机中,Java只是通过TCP与native programme通信,NP在运行过程中都是是直接消耗物理内存并不消耗分配给虚拟机的内存,所以即使NP程序抛出outofmemoryerror,java内存消耗不高但是机器内存飞涨的问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值