1)Java堆

所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示:

public class HeapOOM {

static class OOMObject{}

/**

* @param args

*/

public static void main(String[] args) {

List list = new ArrayList();

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 list = new ArrayList();

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栈和本地方法栈。

sample java_从sample来学习Java堆(转)相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...

  2. fitnesse java_从Fitnesse中学习Java单元测试

    从第一次知道Fitnesse这个集成测试工具到现在也已经差不多有2年多的时间了.在这个期间把Fitnesse的源码也算是反反复复阅读了很多遍,算是对其实现的原理和方法有所了解.在最近一次对Fitnes ...

  3. 新手学java_新手如何学习Java

    新手如何学习Java Java作为一门高级编程语言在信息科技时代有着广泛的应用.新手如何学习Java呢?下面小编来给大家介绍Java的学习方法,希望对大家有帮助! 1理解Java思想 Java是一门面 ...

  4. 怎么判断适合学java_如何知道自己是否适合学习java开发

    有时候,我们都会对自己的未来进行短期和长期的规划,以期可以实现自己曾经定下来的目标.而对于一些对编程语言非常感兴趣的人来说,怎样选择一门适合自己的编程语言是最为重要的.相信程序员们对于编程语言一定不会 ...

  5. Math源码java_深入学习java源码之Math.sin()与 Math.sqrt()

    深入学习java源码之Math.sin()与 Math.sqrt() native关键字 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这个语言来写即可.Java平台有个用户和本地C代码进行 ...

  6. 测试学习java_使用Junit测试框架学习Java

    前言 在日常的开发中,离不开单元测试,而且在学习Java时,特别是在测试不同API使用时要不停的写main方法,显得很繁琐,所以这里介绍使用Junit学习Java的方法.此外,我使用log4j将结果输 ...

  7. 怎么样才能学好java_论新手该如何学习java?

    由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...

  8. 多高学历的人能学懂java_初中学历学习java能行吗?

    初中学历报培训班?你是不是被洗脑了?是你就眨眨眼 初中学历一样可以学习Java,没有哪一条规定学历低就不能学习Java 能不能找到工作取决于你的技术,还取决于你的运气,假如你头简历碰到一家不要求学历的 ...

  9. 如何系统的学习java_如何系统学习java

    如何系统学习java Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性.下面小编收集了一些 ...

最新文章

  1. python aes_python AES 加密
  2. VTK修炼之道6_仔细分析一个复杂程序
  3. 【工作分解法】IT人,你的工作“轻松”么?
  4. VSCode配置Python编辑器
  5. tea 加密密钥生成_加密密钥生成需要的是熵的良好来源
  6. 管理感悟:回字有几种写法的面试
  7. 常用DB9外设接口定义
  8. mybatis基础(下)
  9. RAL 2022|基于3D语义共视图的语义SLAM精确回环检测
  10. du命令参数-h/-s
  11. 八:用MATLAB求传递函数的单位阶跃响应并绘制出曲线
  12. 基于Pacemaker+Corosync的PostgreSQL HA故障两例
  13. 2019最新抖音全方位数据分析报告
  14. 多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
  15. 做短视频时如何将文字转为语音?分享三个小方法,教你轻松配音
  16. 小学生学计算机,学计算机对小学生的好处
  17. 记一次配置rewrite和return的经历
  18. java饲养员喂动物_体现JAVA中的面向对象思想,接口(抽象类)的用处 :饲养员给动物喂食物...
  19. 原创_Android Jetpack Compose 最全上手指南,互联网寒冬公司倒闭后
  20. 自适应流媒体传输-fmp4

热门文章

  1. 月薪20k-50k| 西人马3D机器视觉算法、语音识别、DSP软件工程师招聘
  2. React history.push 传递参数
  3. LeetCode 52. N皇后 II
  4. J. Cheminform. | GraphSol:预测接触图助力蛋白质溶解度预测
  5. Python—pandas中DataFrame类型数据操作函数
  6. ubuntu下使用SVN
  7. 批量提取出apk文件中的classes.dex文件
  8. java timer和timertask_Timer和TimerTask与Java中的线程+睡眠
  9. 在线作图|如何绘制带分组的散点图
  10. Bioinformatics:吉林大学刘富组-深度学习从宏基因组序列中识别短病毒序列Virtifier...