码迷,mamicode.com
首页 > 编程语言 > 详细

Java内存区域与内存溢出异常

时间:2017-04-19 00:25:29      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:类信息   大于   相同   动态   异常   存储   卸载   编译器   代码   

    先贴上一段参数设置

JAVA_OPTS=" $JAVA_OPTS -Dspring.profiles.active=test -DLOG_DIR=/home/work/logs 
-Xms2048m -Xmx2048m -Xss1m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=128m
-XX:MaxPermSize=512m -XX:SurvivorRatio=6 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Dfile.encoding=UTF-8
"

    很多时候,将代码部署到服务器,都会对JAVA_OPTS进行一些操作,大多数情况对主要两个知道是干嘛的,其实的哪copy的算哪的。

    所以,看了点资料,想写点东西。

    Java虚拟机运行时数据区,主要包括以下部分:方法区、堆,它们是线程共用的部分;虚拟机栈、本地方法栈、程序计数器。下面我

大概讲讲如上几个部分。

1. 程序计数器。
    线程自己的数据区,用以记录当前线程所执行的字节码的行号指示器,主要用于在线程切换过程中,保证切换后能够恢复到正确的执行位置,此区域是惟一一个在Java虚拟机规范中没有规定任何OOM情况的区域。

2. Java虚拟机栈。
    线程独自拥有,生命周期与线程相同。异常状况,若线程请求栈深度大于虚拟机所允许,则StackOverflowError,若虚拟机栈可动态扩展,在扩展无法申请得到足够内存则OOM。

3. 本地方法栈。
    相对于虚拟机栈为虚拟机执行Java方法服务,本地方法栈则为虚拟机使到的Native方法服务。为线程私有空间。

4. Java堆。
    线程共享区域,在虚拟机启动时创建,为GC管理的主要区域。可设置为固定或者可扩展大小,由-Xmx和-Xms控制,设置成一样即为固定。若无空间分配实例,且无法扩展,则OOM。

5. 方法区。
    线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。此区域也要GC,主要是对常量池回收和对类型的卸载,会有OOM异常。(运行时常量池,用于存放编译期生成的各种字面量和符号引用,在类加载后存储,运行期间也可能将新的常量放入池中,如String类的intern()方法)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PS:此文由看《深入理解Java虚拟机:JVM高级特性与最佳实践》而来

Java内存区域与内存溢出异常

标签:类信息   大于   相同   动态   异常   存储   卸载   编译器   代码   

原文地址:http://www.cnblogs.com/hawk-whu/p/6731260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!