JVM内存结构及内存溢出分析

本文围绕Java虚拟机(JVM)展开,介绍其是java编译器和os平台间的虚拟处理器。阐述了JVM内存结构,包括线程共享的方法区、堆,以及线程私有的虚拟机栈等。还分析了JVM堆内存和栈内存溢出的原因,如大量递归、循环等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.了解JVM

  Java虚拟机是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。

2.JVM内存结构

  

 

所有线程共享的内存数据区:方法区,堆。而虚拟机栈,本地方法栈和程序计数器都是线程私有的。

   1、存放于栈中的:

    a 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(如变量的名字)。

    b每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

    c 方法的形式参数,方法调用完后从栈空间回收。

    d 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC。

   2、存放于堆中的:

    a 存储的全部是对象,每个对象包含一个与之对应的class信息

    b Jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身

   3、存放于方法区中的:

    a 存放线程所执行的字节码指令

    b 跟堆一样.被所有线程共享.方法区包含:static变量

  注意、Class实例在jdk1.6及之前是存放在方法区中, 在jdk1.7及之后存放在堆中。

     常量池在jdk1.6及之前是存放在方法区中,在jdk1.7存放在堆中,在jdk1.8存放在元空间中。

 3.JVM堆内存溢出

  

  

 

  分析堆内存溢出的原因可能如下:

    a.  使用了大量的递归或无限递归(递归中用到了大量的新建的对象)

    b.  使用了大量循环或死循环(循环中用到了大量的新建的对象)

    c.  类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;

    d.  数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放,会大量存储在内存中。

4.JVM栈内存溢出

   

  

   分析栈内存溢出的原因可能如下:   

    a.  使用了大量的递归或无限递归

    b.  使用了大量循环或死循环(如循环中不停调用方法)

    c.  list,map,数组等长度过大等。

 

转载于:https://www.cnblogs.com/ywb-articles/p/10530813.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值