java 堆溢出:

在eclipse中测试时,可以在Debug/Run中设置虚拟机参数,比如-xmx 20M 代表虚拟机堆内存大小最大值是20M,-xms是最小堆内存。然后写个死循环测试类不断在List集合中添加对象, 当堆内存超出20M ,会报OutOfMemory异常。

虚拟机栈和本地方法栈溢出:

一个线程中如果,方法的深度超过了虚拟机允许的深度 ,会报StackOverFlow异常,比如递归调用方法。这个异常容易去实现,另一种是java虚拟机栈在扩展时如果无法申请到内存,则会报OutOfMemory异常。

public class Main {

private static int count=0;

public static void main(String[] args) {

// TODO Auto-generated method stub

try{

deap();

}catch(Exception ex){

ex.printStackTrace();

}

}

private static void deap(){

count++;

System.out.println(count);

deap();

}

}

在设置-Xss为1M 和 10M时, 输出的计数变量会差10倍左右,我的理解是虚拟机栈运行时其实就是java方法执行时内存模型,在无止境的递归时会向虚拟机栈中压入栈帧用于存储执行时的操作数,局部变量方法出口等信息。当这块内存满时,就会报栈溢出。

操作系统中系统限制了每一个进程的内存上限, 如果规定每个进程的内存大小上限为1GB, 那么在虚拟机中,方法区内存和堆内存可以通过虚拟机参数设置(xmx和 maxPerSize),虚拟机进程内存减去 堆内存和方法区的总内存,如果忽略计数器和虚拟机本身执行所消耗的内存(这两部分占的内存很小),基本上剩下的内存会被虚拟机栈和本地方法栈瓜分。 每一个线程分配到的虚拟机栈内存越大,那么可以创建的线程数量就越少。

3.方法区和运行时常量池溢出:

方法区内存大小设置可以通过虚拟机参数 -XX:PermSize 和 -XX:MaxPermSize来设置,java 1.6环境中以下代码可以实现方法区常量池内存溢出:

public static void main(String[] args) {

// TODO Auto-generated method stub

int i=0;

ArrayList list=new ArrayList();

while(true){

list.add(String.valueOf(i++).intern());

}

}

这里String.intern()方法的作用是字符串常量池中如果存在一个等于这个String对象的字符串,则返回引用,否则会将此字符串存入常量池,java 1.6中常量池是分配在永久代内存中,gc几乎不会去回收,所以常量池内存会溢出(1.7 虚拟机中已将字符串常量池从永久代移除), 填充方法区内存可以使用gclib来创建大量的类,因为方法区用于存放类Class的相关信息用的,比如类名,访问修饰符,常量池等, Spring,OSGI等主流框架会遇到这样的问题,这类框架都需要加载大量的类,而回收一个类判定条件比较苛刻,在方法区内存分配小时会报OutOfMemoryError:PerGen space异常,即方法区溢出。

4.本机内存溢出:

DirectMemory 容量可以通过设置虚拟机参数 -XX:MaxDirectMemorySize来设定,实验方法: 设置了直接内存上限后,不断地通过unsafe类的allocateMemory()方法去申请内存,当达到上限时会报:OutOfMemory异常.

参考连接:

http://lavasoft.blog.51cto.com/62575/25492/

java虚拟机内存溢出的三个原因_java虚拟机学习(三) 内存溢出异常相关推荐

  1. java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写

    假设你的手机已经root,并已开启frida服务,电脑端已安装好Python,frida,IDA,GDA. 样本地址: 链接: https://pan.baidu.com/s/1y3kIXcBv25Q ...

  2. 虚拟机中那些可以作为root对象_java虚拟机面试题及答案整理

    下面要给大家带来的是和java虚拟机相关的面试题,那么常见的java虚拟机面试题都有哪些呢?下面就让我们一起来了解一下和它有关的最新的面试题吧! 面试题: 1.JVM垃圾回收机制,什么时候触发Mino ...

  3. java基本类型有缓冲区类型的有_Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类...

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用"="或者使用"new String(...)" String aStr = " ...

  4. java包名和类名可以一样吗_Java入门第三课:Java基本语法

    Java基础 编写Java程序时,应注意以下几点: 1.大小写敏感: Java是大小写敏感的,这就意味着标识符Hello与hello是不同的.有些操作系统不区分大小写,不区分的话,文件名是不完全正确的 ...

  5. java创建多个线程 延时1秒_Java 多线程(三)优化任务执行

    本篇文章通过服务器通信和页面渲染两个功能的实现来加深多线程中Future和Executor的理解. 服务器通信 串行执行任务 任务执行最简单的策略就是在单线程中串行执行各项任务,并不会涉及多线程. 以 ...

  6. java三种注释_java注释的三种形式分别是什么

    java注释的三种形式分别是:1.单行注释,如[//单行注释]:2.多行注释,如[/*多行注释*/]:3.文档注释,如[/**@author*/]. JAVA的注释共有三种形式:单行注释.多行注释.文 ...

  7. java三步 网易_Java基础:三步学会Java Socket编程·网易学院·教程

    设计原理: 服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理.在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出. {源码 ...

  8. java 线程起名字_java多线程学习三::::为什么要给线程起名字并且知道守护作用?...

    为什么要会线程起名字呢? 你如果拿到一连串的Thread-01,Thead-02我想你应该会疯掉,看以下代码 package rs.thread.day0504; /** * @auther rs * ...

  9. java虚拟机的内存_Java虚拟机的内存结构

    我们都知道虚拟机的内存划分了多个区域,并不是一张大饼.那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快.是的,如果不进行区域划分,扔的时候确实痛快,可 ...

  10. android studio占内存大小,极大精简android studio在C盘的内存

    在C盘占很大的内存大约就2种原因: 1.SDK占内存太大 2.AVD模拟器占内存太大 第一种情况,移动SDK(用android studio不需要配置环境变量) 先移动C盘的Android目录,里面是 ...

最新文章

  1. exp()用法和点乘的原因
  2. 七十、Vue城市页面Ajax动态渲染和兄弟组件数据传递
  3. 力扣628. 三个数的最大乘积
  4. 计算机外接硬盘存储器,电脑存“片”究竟是用内置硬盘好,还是外置的好?
  5. linux web目录安全设置,[LNMP]Linux的Web环境的安全配置
  6. CV520国产替代Ci521 13.56MHz 非接触式读写器芯片
  7. PDF转CAD经典软件有什么
  8. 映美精IC Imageing Control .net控件调试问题
  9. vue.js 菜鸟学习
  10. 我过去的那些编程思想
  11. Ar大屏幕互动,面向非专业领域的体验
  12. chrome安装插件提示image decode failed
  13. 2021-10-19 nlp_1 nltk的基本应用
  14. ocp 考试相关资料
  15. android培训感想
  16. 基于BCIduino脑电模组和OpenVibe的P300意念打字系统搭建
  17. 面向对象程序设计方法RPG小游戏实例
  18. 情感驿站 | 为人处世的行为准则总结
  19. 【ParaView教程】第四章 常见问题 —— 怎样绘制二维翼型上压力系数Cp或马赫数Mach沿翼型的变化?
  20. ERP : 钢铁行业解决方案

热门文章

  1. div+css 怎么让一个小div在另一个大div里面 垂直居中
  2. 团队项目:VS2013和SQL Server2012的连接使用
  3. java开发中常用linux指令,Java开发需掌握的常用Linux命令
  4. winform Chart图表控件使用(绑定数据)
  5. C#中获取今天是星期几
  6. 遇到系统问题,先看OS再看CPU
  7. 上班时真的很困怎么办
  8. 头目一天不来,就公然上班睡觉,主管怎么当得
  9. 拿工资,要做差不多的事
  10. 使用jps查看JAVA进程号