一、背景知识

1、JVM体系结构

2、JVM运行时数据区

3、JVM内存模型

JVM运行时内存 = 共享内存区 + 线程内存区

3-1、共享内存区

共享内存区 = 持久带 + 堆

持久带 = 方法区 + 其他

堆 = Old Space + Young Space

Young Space = Eden + S0 + S1

3-1-1、持久代

JVM用持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。

可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。

Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没

有Permanent Space而用其他机制来实现方法区。

3-1-2、堆

堆(heap),主要用来存放类的对象实例信息(包括new操作实例化的对象和定义的数组)。

堆分为Old Space(又名,Tenured Generation)和Young Space。

Old Space主要存放应用程序中生命周期长的存活对象;

Eden(伊甸园)主要存放新生的对象;

S0和S1是两个大小相同的内存区域,主要存放每次垃圾回收后Eden存活的对象,作为对象从Eden过渡到Old Space

的缓冲地带(S是指英文单词Survivor Space)。

堆之所以要划分区间,是为了方便对象创建和垃圾回收,后面垃圾回收部分会解释。

3-2、线程内存区

线程内存区=单个线程内存+单个线程内存+.......

单个线程内存=PC Regster+JVM栈+本地方法栈

JVM栈=栈帧+栈帧+.....

栈帧=局域变量区+操作数区+帧数据区

在Java中,一个线程会对应一个JVM栈(JVM Stack),JVM栈里记录了线程的运行状态。

JVM栈以栈帧为单位组成,一个栈帧代表一个方法调用。栈帧由三部分组成:局部变量区、操作数栈、帧数据区。

二、堆溢出

堆(Heap)是Java存放对象实例的地方。

堆溢出可以分为以下两种情况,这两种情况都会抛出OutOfMemoryError:java heap space异常:

1、内存泄漏

内存泄漏是指对象实例在新建和使用完毕后,仍然被引用,没能被垃圾回收释放,一直积累,直到没有剩余

内存可用。

如果内存泄露,我们要找出泄露的对象是怎么被GC ROOT引用起来,然后通过引用链来具体分析泄露的原因。

分析内存泄漏的工具有:Jprofiler,visualvm等。

示例代码:

package com.jvm;import java.util.ArrayList;
import java.util.List;
import java.util.UUID;/*** 内存泄漏* @author feizi* @time 2015-1-23上午8:42:53*/
public class OOMTest {public static void main(String[] args) {List<UUID> list = new ArrayList<UUID>();while(true){list.add(UUID.randomUUID());}}}

看看控制台的输出结果,因为我这边的JVM设置的参数内存足够大,所以需要等待一定的时间,才能看到效果:

如果是用CMD命令行,就可以自己指定参数编译运行了,这样效果就更快一些:

通过下列命令运行程序,注意先要用javac命令将.java源文件编译成.class类字节码文件。

java -Xms10M -Xmx10M -XX:-UseGCOverheadLimit OOMTest

2、内存溢出

内存溢出是指当我们新建一个实力对象时,实例对象所需占用的内存空间大于堆的可用空间。

如果出现了内存溢出问题,这往往是程序本生需要的内存大于了我们给虚拟机配置的内存,这种情况下,我们可以采用调大-Xmx来解决这种问题。

示例代码:

package com.jvm;import java.util.ArrayList;
import java.util.List;/*** 内存溢出* @author feizi* @time 2015-1-23上午8:56:22*/
public class OOMTest_1 {public static void main(String args[]){List<byte[]> byteList = new ArrayList<byte[]>();byteList.add(new byte[1000 * 1024 * 1024]);}
}

看看控制台的运行效果:

使用CMD命令行指定参数运行:

java -verbose:gc -Xmn10M -Xms20M -Xmx20M -XX:+PrintGC OOMTest_1

三、线程栈

栈(JVM Stack)存放主要是栈帧( 局部变量表, 操作数栈 , 动态链接 , 方法出口信息 )的地方。注意区分栈和栈帧:栈里包含栈帧。

与线程栈相关的内存异常有两个:

a)、StackOverflowError(方法调用层次太深,内存不够新建栈帧)

b)、OutOfMemoryError(线程太多,内存不够新建线程)

1、java.lang.StackOverflowError

栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候,请求新建栈帧时,

栈所剩空间小于战帧所需空间。

例如,通过递归调用方法,不停的产生栈帧,一直把栈空间堆满,直到抛出异常 :

示例代码:

package com.jvm;
/*** 栈溢出* @author feizi* @time 2015-1-23上午9:13:11*/
public class SOFTest {public void stackOverFlowMethod(){stackOverFlowMethod();}/*** 通过递归调用方法,不停的产生栈帧,一直把栈空间堆满,直到抛出异常 :* @param args*/public static void main(String[] args) {SOFTest sof = new SOFTest();sof.stackOverFlowMethod();}}

看看控制台运行的效果:

Java内存溢出与栈溢出相关推荐

  1. java内存溢出 栈溢出的原因与排查方法

    java内存溢出 原因与排查方法 1. 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出.如果出现这种现象可行代码排查: 一 ...

  2. Java 中(堆溢出、内存溢出、栈溢出)

    Java 内存溢出有以下三种 (1) java.lang.OutOfMemoryError: Java heap space --JVM Heap(堆)溢出 JVM 在启动的时候会自动设置 JVM H ...

  3. Java内存溢出详解之Tomcat配置

    Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...

  4. java 二维数组内存溢出_模拟Java内存溢出

    本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数 这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations 然后 ...

  5. Java内存溢出详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  6. tomcat java内存_[Tomcat]Java内存溢出详解Tomcat内存设置

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1.java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在启 ...

  7. Java 内存溢出(一)原因、复现、排查

    目录 一.内存溢出原因 二.内存溢出实例 1.堆溢出 2.虚拟机栈和本地方法栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 三.内存溢出排查 内存溢出: 是指应用系统中存在无法回收的内存或 ...

  8. 常见的Java内存溢出情况和实例

    文章目录 内存溢出的原因 栈溢出 栈溢出的第1种情况,死递归,抛出StackOverflowError 栈溢出的第2种情况,线程太多,抛出OutOfMemoryError 堆溢出 1.初始对象太大,超 ...

  9. Java内存溢出场景及解决办法

    Java内存溢出即程序在申请内存时,没有足够的空间供其使用,出现out of memory.常见于四种情况:栈溢出(StackOverflowError).堆溢出(OutOfMemoryError:j ...

最新文章

  1. 使用CSS3美化复选框checkbox
  2. python【蓝桥杯vip练习题库】ALGO-77 斜率计算
  3. 2017.3.20上午
  4. Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!...
  5. 安装Xen Server创建虚拟机
  6. 『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)
  7. Duilib编辑框Edit输入完自动跳到下一个编辑框
  8. HDU-6180 Schedule
  9. ❤️六W字《计算机基础知识》(八)(建议收藏)❤️
  10. 图解TCPIP-NAT
  11. Skyline开发1-环境搭建
  12. java线程学习笔记
  13. UI自动化测试之iframe切换
  14. jscpd--前端代码重复率检测
  15. express实现上传图片到七牛云
  16. 武汉科技大学计算机专业怎样,武汉科技大学计算机专业就业情况如何
  17. 《CSAPP》(第3版)答案(第四章)
  18. win10一直显示无网络连接到服务器,win10的网络为什么会有时显示无法连接到internet...
  19. Latex使用遇到的问题
  20. OpenXR+Runtime:OpenXR SDK与Runtime的衔接

热门文章

  1. 软件生命周期中的测试概念,IT软件生命周期中的重要概念
  2. 中国无人零售商店前景展望与未来发展预测分析报告2022-2028年版
  3. 街都|从阿里巴巴到Gucci,马云的“新零售”模式如何让中国领先于世界
  4. phpMyAdmin配置文件现在需要一个短语密码的解决方法
  5. mysql要求cpu主频还是核数_CPU主频和核数哪个更重要?电脑CPU到底主频高好还是多核好?...
  6. 1.什么是冲突域?什么是广播域?
  7. Redis面试常见问题
  8. 云计算课程大纲,Linux云计算运维课程视频
  9. Python - 海龟图
  10. “神童”Tom Ding:区块链是下一代云计算和互联网的基础