1)Java堆
  所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示:
  
  public class HeapOOM {
  static class OOMObject{}
  /**
  * @param args
  */
  public static void main(String[] args) {
  List<OOMObject> list = new ArrayList<OOMObject>();
  while(true){
  list.add(new OOMObject());
  }
  }
  }
  加上JVM参数-verbose:gc -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError,就能很快报出OOM:
  Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  并且能自动生成Dump.
2)方法区
  方法区是存放虚拟机加载类的相关信息,如类、静态变量和常量,大小由-XX:PermSize和-XX:MaxPermSize来调节,类太多有可能撑爆永久带:
  
  public class MethodAreaOOM {
  static class OOMOjbect{}
  /**
  * @param args
  */
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  while(true){
  Enhancer eh = new Enhancer();
  eh.setSuperclass(OOMOjbect.class);
  eh.setUseCache(false);
  eh.setCallback(new MethodInterceptor(){
  @Override
  public Object intercept(Object arg0, Method arg1,
  Object[] arg2, MethodProxy arg3) throws Throwable {
  // TODO Auto-generated method stub
  return arg3.invokeSuper(arg0, arg2);
  }
  });
  eh.create();
  }
  }
  }
  加上永久带的JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后会报如下异常:
  Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
  静态变量或常量也会有可能撑爆方法区:
  
  public class ConstantOOM {
  /**
  * @param args
  */
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  List<String> list = new ArrayList<String>();
  int i=0;
  while(true){
  list.add(String.valueOf(i++)。intern());
  }
  }
  }
  同样加上JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后报如下异常:
  Exception in thread "main" java.lang.OutOfMemoryError: PermGen space

  3)Java栈和本地方法栈
  栈是存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息,栈大小由Xss来调节,方法调用层次太多会撑爆这个区域,samples如下所示:
  
  package com.cutesource;
  public class StackOOM {
  /**
  * @param args
  */
  private int stackLength = 1;
  public void stackLeak(){
  stackLength++;
  stackLeak();
  }
  public static void main(String[] args) throws Throwable{
  // TODO Auto-generated method stub
  StackOOM oom = new StackOOM();
  try{
  oom.stackLeak();
  }catch(Throwable err){
  System.out.println("Stack length:" + oom.stackLength);
  throw err;
  }
  }
  }
  设置JVM参数:-Xss128k,报出异常:
  Exception in thread "main" java.lang.StackOverflowError
  打印出Stack length:1007,这里可以看出,在我的机器上128k的栈容量能承载深度为1007的方法调用。当然报这样的错很少见,一般只会出现无限循环的递归中,另外,线程太多也会占满栈区域:
  
  package com.cutesource;
  public class StackOOM {
  /**
  * @param args
  */
  private int stackLength = 1;
  private void dontStop(){
  while(true){
  try{Thread.sleep(1000);}catch(Exception err){}
  }
  }
  public void stackLeakByThread(){
  while(true){
  Thread t = new Thread(new Runnable(){
  @Override
  public void run() {
  // TODO Auto-generated method stub
  dontStop();
  }
  });
  t.start();
  stackLength++;
  }
  }
  public static void main(String[] args) throws Throwable{
  // TODO Auto-generated method stub
  StackOOM oom = new StackOOM();
  try{
  oom.stackLeakByThread();
  }catch(Throwable err){
  System.out.println("Stack length:" + oom.stackLength);
  throw err;
  }
  }
  }
  报出异常:Exception in thread "main" java.lang.OutOfMemoryError:unable to create new native thread
  不过在windows上运行这个例子要小心,会出现系统假死的情况,有可能需要重启机器才行。
  以上几个例子虽然比较简单,但能很好帮助普通的程序员更加直观的了解Java堆,方法区,Java栈和本地方法栈。

http://www-01.ibm.com/support/knowledgecenter/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/gcroots.html

从sample来学习Java堆(转)的更多相关文章

  1. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

  2. JVM学习--(八)java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

  3. java基础学习之"堆" "栈" "静态存储区" "方法区"

    引用部分 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来) Java堆.栈和常量池以及相关String的讲解 等我看完"深入理 ...

  4. 如何学习Java?

    一点感悟 java作为一门编程语言,在各类编程语言中作为弄潮儿始终排在前三的位置,这充分肯定了java语言的魅力,在实际项目应用中,我们已经无法脱离javaa(Ps当然你可以选择不使用),但它的高性能 ...

  5. 应用JConsole学习Java GC

    应用JConsole学习Java GC 关于Java GC的知识,好多地方都讲了很多,今天我用JConsole来学习一下Java GC的原理. GC原理 在我的上一篇中介绍了Java运行时数据区,在了 ...

  6. 用Robocod游戏来学习JAVA

    Robocode(用游戏来学习Java技术还是用Java来玩游戏?)用你的JAVA编程技术来玩游戏吧!不会JAVA?那就用游戏来学习JAVA吧!什么是Robocode? 其实我对机器人一直很感兴趣.我 ...

  7. 优化Java堆大小5温馨提示

    总结:Java没有足够的堆大小可能会导致性能非常大的影响,这无疑将给予必要的程序,并不能带来麻烦.本文总结了影响Java居前五位的能力不足,并整齐地叠优化? 笔者Pierre有一个10高级系统架构师有 ...

  8. Java堆和栈的区别和介绍,JVM的堆和栈

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存.   堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. ...

  9. 浅谈Java堆内存分代回收

    目录 1.概述 2.堆内存是如何分代的 3.各分代之间是如何配合工作的 1.概述 与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我 ...

随机推荐

  1. [分享]我的LABVIEW快速开发串口测试软件实例

    LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...

  2. Oracle Trunc

    http://www.cnblogs.com/xiaoyudz/archive/2011/03/18/1988467.html

  3. 关于ArcGIS Rest API

    ArcGIS Rest API: 9.3版本: http://resources.esri.com/help/9.3/arcgisserver/apis/rest/index.html 10版本:ht ...

  4. Java Keyword -- super

    Reference: super When we override superclass's methods, but still want to invoke them, we can use ke ...

  5. (转载)HDU4565

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 这个博客讲的比较好:http://blog.csdn.net/ljd4305/article/d ...

  6. hdu1172猜数字(暴力枚举)

    猜数字 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. Linux NFS服务器的安装与配置(转载)

    一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...

  8. Spring-Junit4

      Spring整合Junit4测试Service 1. 加入依赖包 使用Spring的测试框架需要加入以下依赖包: JUnit 4 (官方下载:https://github.com/KentBeck ...

  9. Oracle Enterprise linux 7 安装Oracle11gR2

    一.修改主机名和IP地址: [root@localhost Desktop]# cat /etc/hosts127.0.0.1 localhost.localdomain localhost 192. ...

  10. [KMP求最小循环节][HDU3746][Cyclic Nacklace]

    题意 给你个字符串,问在字符串末尾还要添加几个字符,使得字符串循环2次以上. 解法 无论这个串是不是循环串 i-next[i] 都能求出它的最小循环节 代码: /* 思路:kmp+字符串的最小循环节问 ...