学习【深入理解java虚拟机】 Java内存

java内存
运行时数据区域

1程序计数器

2java虚拟机栈
     线程私有的,生命周期和线程一致
     存放局部变量,编译期间已经知道的基本数据类型
     经常有人把内存分为堆和栈,分类比较粗糙,但是也说明大家最关注这2个

3本地方法栈(和2类似,给外调的非java使用的)

4java堆
     最大的一块
     所有对象实例都在这里
     是java GC的主要区域
5方法区(永久带)
     是各个线程共享的一个区域
     用于存放被加载的类信息,常量,静态变量    
     是对象的一部分,但是叫非堆
     低版本可能回收不够,抛异常
     方法区无法满足内存的时候,就是outofMenoryError错误、
     
     6运行时常量池
     方法区的一部分class的版本,作者,等消息

7直接内存(调非java方法时,或者io交互)

--------------------------------------------------
1java堆溢出
不断的往list里面添加对象,

/**
 * VM Args:  - Xms20m  - Xmx20m  - XX:+HeapDumpOnOutOfMemoryError
 *  @author  dzl
 *
 */
public  class  TestOOM {
       static  class  OOMObject{
            
      }
       public  static  void  main(String[] args) {
            List<OOMObject> list =  new  ArrayList<TestOOM.OOMObject>();
              while  (  true ) {
                  list.add(  new  OOMObject());
                  
            }
      }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
      at java.util.Arrays.copyOf(  Arrays.java:2760 )
      at java.util.Arrays.copyOf(  Arrays.java:2734 )
      at java.util.ArrayList.ensureCapacity(  ArrayList.java:167 )
      at java.util.ArrayList.add(  ArrayList.java:351 )
      at com.travelsky.sh.mytrip.webservice.serrvice.TestOOM.main( TestOOM.java:18 )



2虚拟机栈和本地方法栈溢出stackOverflowError
死循环累加
32位内存限制是2个G,
减去Xmx最大推容量,减掉MaxPermSize(最大方法区容量),忽略计数器,剩下的就是虚拟机栈的容量
要扩大这个容量,就需要减小最大堆容量或者方法区容量

也就是说
      最大推容量 Xmx(最小Xms)+ 最大方法区容量 MaxPermSize+ 虚拟机栈的容量Xss
MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m

3方法区和运行时常量异常
静态变量太多
OutOfMemoryError: permGen space 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值