注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

qus的博客

 
 
 

日志

 
 

《深入理解JAVA虚拟机》-内存区域与内存溢出异常  

2013-02-11 21:46:13|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
java内存的数据区分为:
程序计数器:如果执行java字节码,存储下条指令的地址,如果是native方法,为空
虚拟机栈:java的执行系统是基于栈的执行系统(区别于寄存器执行系统)。java的每个方法被执行的时候都会建立一个机栈。存储包括局部变量表,操作数栈,动态链接,方法出口等信息。
异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常
如果机栈可以动态拓展,当拓展的时候无法申请足够内存的时候,抛出OutOfMemoryError异常
本地方法栈:native方法使用的栈
异常:情况和虚拟机栈类似
java堆(共享):
几乎所有的对象都分配在堆上,除了基于逃逸分析技术等的对象分配优化。
GC回收主要针对本块内存,具体的回收器工作请戳这里TODO。
异常:如果分配实例失败且不能拓展,抛出OutOfMemoryError
方法区(共享),别名非堆:
存储类信息,常量,静态变量,编译后的代码等
异常:如果方法区无法满足内存分配的需求,抛出OutOfMemoryError
常量池:
常量池是方法区的一部分,存放在class类文件中,class文件的格式请戳这里TODO
异常:跟方法区一致
直接内存:
通过nativa函数库直接分配堆外内存,然后通过一个堆里面的对象来进行操作。
在一些场景中可以避免在java堆中和native堆中来回复制数据。


JAVA堆溢出
参数
-xx:+HeapDumpOnOutOfMemoryError 可以将堆转存快照以便事后分析。具体请戳这里TODO
解决内存溢出
1.首先针对堆文件,确认对象是否必要,分清楚是内存泄露还是内存溢出
2.如果是内存泄露,查看泄露对象到RCGROOTS的引用链。针对性地解决
3.如果是内存溢出,就应当检查对参数与机器物理内存对比,是否可以调大
代码上,检查是否能检查对象的生命周期
  评论这张
 
阅读(807)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017