首页 > 编程知识 正文

java读取文件内存溢出(java常见内存泄露)

时间:2023-05-04 10:25:17 阅读:75854 作者:4523

3359 blog.csdn.net/z 69183787/article/details/75530650

一、背景知识

1、JVM体系结构

2、JVM运行时数据区

3、JVM内存模型

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

3-1、共享内存区域

共享内存空间=永久带堆

持续带=方法区其他

堆=Old Space Young Space

Young Space=加油大炮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主要存储APP应用程序中生命周期长的生存对象;

奋斗的大炮(伊甸园)主要是保管qxdxs的对象;

S0和S1是大小相同的两个内存区域,主要存储每次回收垃圾时奋斗的大炮生存的对象,从对象奋斗的大炮转移到Old Space

的缓冲区(s是指英语单词Survivor Space )。

堆划分区间是为了方便对象的创建和垃圾回收,在后面的垃圾回收部分进行说明。

3-2、线程存储器区域

线程内存空间=单线程内存单线程内存……。

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

JVM堆栈=堆栈帧堆栈帧.

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

在Java中,线程对应于JVM堆栈(JVM堆栈),JVM堆栈记录线程的执行状态。

JVM堆栈由堆栈帧组成,堆栈帧表示方法调用。 堆栈框架由三部分组成:局部变量区域、操作数堆栈和帧数据区域。

二.山青水秀

“堆”是Java存储对象实例的位置。

堆溢出可以分为两种情况:抛出内存溢出错误3360 javaheapspace异常。

1、内存泄漏

内存泄漏是指对象实例在新创建和使用完成后仍会被引用,不会通过垃圾回收释放,并一直存储到没有剩余的内容为止

内存可用。

内存泄漏时,调查泄漏对象是如何被GC ROOT引用的,并通过引用链具体分析泄漏的原因。

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

示例代码:

packagecom.jvm; importjava.util.ArrayList; importjava.util.List; importjava.util.UUID; /**内存泄漏

*@authorfeizi

* @time 2015-1-23上午8:42:53*/

publicclassoomtest { publicstaticvoidmain { string [ ] args }

列表列表=new ArrayList (; while (真)。

list.add(uuid.Randomuuid ) );

}

}

}

看看控制台的输出结果。 这里的JVM参数内存足够大,需要等待一定的时间才能看到效果:

如果使用的是CMD命令行,则可以自行指定参数进行编译和执行,从而加快效果。

请注意,使用以下命令运行程序,并首先使用javac命令将. java源文件编译为. class类字节代码文件:

Java-XM S10 m-XM X10 m-xx :-usegcoverheadlimitoomtest

2、内存溢出

内存溢出意味着在创建新的实力对象时,实例对象比堆中的可用空间占用更多的内存空间。

如果出现内存溢出问题,则可以增加-Xmx来解决此问题,因为程序通常需要的内存大于为虚拟机配置的内存。

示例代码:

packagecom.jvm; importjava.util.ArrayList; importjava.util.List; /**内存溢出

*@authorfeizi

* @time 2015-1-23上午8336056336022*

publicclassoomtest _1{ publicstaticvoidmain { string args [ ] }

列表字节列表=new ArrayList (;

byte list.add (new byte [ 1000 * 1024 * 1024 ];

}

}

看看控制台的效果:

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

jva-verbose : GC-xmn 10 m-xms 20m-xmx 20m-xx : printgcoomtest _ 1

三.线程堆栈

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

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

a ),堆栈溢出错误) )方法调用层次太深,内存不足导致创建新的堆栈帧) ) )。

b ),内存溢出) )线程太多,内存不够,创建新线程) )。

1、java.lang.StackOverflowError

堆栈溢出抛出java.lang.StackOverflowError错误。 这是因为,在方法正在执行、请求新的堆栈帧时,

堆栈的剩余空间小于战斗框架所需的空间。

例如,通过递归调用方法,可以继续生成堆栈帧,并继续填充堆栈空间直到抛出异常。

示例代码:

packagecom.jvm; /***堆栈溢出

*@authorfeizi

* @time 2015-1-23上午9:13:11*/

公共类软件{公共voidstackoverflowmethod (

堆栈溢出方法(;

通过递归调用}/***方法继续生成堆栈帧,并继续填充堆栈空间直到抛出异常:

*@paramargs*/

publicstaticvoidmain (字符串[ ] args ) {

SOFTest sof=newSOFTest (;

sof.stackOverFlowMethod (;

}

}

看看控制台的效果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。