Java中的OutOfMemoryError的各种状况及处置和JVM内存结构 (java中的方法是什么)
本文目录导航:
Java中的OutOfMemoryError的各种状况及处置和JVM内存结构
在JVM中,内存分为堆内存、非堆内存和本地内存。
堆内存用于调配类实例和数组,非堆内存蕴含方法区和JVM外部处置所需的内存,而本地内存由操作系统治理。
当运行内存无余时,将抛出意外。
在开发环节中,这个失误频繁产生。
处置方法理论从两个方面入手:排查能否有内存走漏的程序BUG,以及调整JVM启动参数以增大内存。
依据揭示消息,OutOfMemoryError有多种状况:
每种失误面前的要素不同,处置战略也需依据详细状况确定。
深化了解JVM内存结构并剖析失误消息,有助于找到针对性的处置方法。
JVM规范将内存划分为多个区域,包括JVM栈、堆、方法区、常量池和本地方法栈。
HotSpot JVM对堆内存结构有详细说明,分为Young Generation、Old Generation和Permanent Generation三个局部。
这些区域的规划和地址空间留给各JVM厂商成功,但HotSpot成功中,Heap对应Young和Old Generation,方法区和常量池对应Permanent Generation。
JVM栈和本地方法栈在HotSpot成功中是同一体。
操作系统对进程地址空间启动治理,32位系统最多可表示4GB虚构内存,其中洼地址空间由系统内核占用,低地址空间供用户程序经常使用。
Java言语的Heap建设在操作系统Heap之上,Stack也是建设在操作系统Stack之上。
Java线程的内存位于JVM或操作系统的Stack空间中,不同于对象的Heap。
了解这一区别关于新手程序员来说至关关键。
针对OutOfMemoryError疑问,本文将逐个剖析要素和处置方法。
1. : Java heap space - 要素:Heap内存溢出,影响Young和Old Generation。
处置:调整Java启动参数-Xms和-Xmx以参与Heap内存。
2. : unable to create new native thread - 要素:Stack空间无余以创立额内线程。
处置:调整-Xss参数以缩小单个线程栈大小,或经过-Xms和-Xmx缩小Heap内存以调配更多Stack空间。
3. : PermGen space - 要素:Permanent Generation空间无余,不可加载额外类。
处置:调整-XX:PermSize和-XX:MaxPermSize参数以参与PermGen内存。
4. : Requested array size exceeds VM limit - 要素:Heap空间无余。
处置:修正程序逻辑,或经过-Xmx增大堆内存。
5. GC破费少量期间但回收大批内存时或者报出OutOfMemoryError。
处置:启动GC turning或优化程序逻辑。
6. - 要素:线程栈溢出,或者是方法调用档次过多或栈太小。
处置:优化程序设计缩小方法调用,调整-Xss参数增大线程栈。
7. : request bytes for . Out of swap space? - 本地内存调配失败。
处置:监控物理内存和替换分区,调整系统设置。
8. : (Native method) - 本地方法内存调配疑问。
处置:审核JNI代码和本地库,优化内存经常使用。
9. : Direct buffer memory - 本地内存调配失败。
处置:调整-XX:MaxDirectMemorySize参数设置Direct内存大小。
10. : GC overhead limit exceeded - 本地内存调配失败。
处置:监控内存经常使用状况,优化程序逻辑和内存治理。
深化了解JVM内存结构和OutOfMemoryError的多种状况,有助于开发者更准确地定位疑问并采取有效处置战略。
Java程序性能优化-缓冲(Buffer)(1)
罕用优化组件和方法
本节关键引见可用于系统性能优化的组件和性能优化思维 重点引见缓冲缓和存这两个组件以及它们的经常使用方法 此外 还将引见几种罕用的优化思维 如池化对象 并行替代串行 负载平衡 以及期间换空间和空间换期间
缓冲(Buffer)( )
缓冲区是一块特定的内存区域 开拓缓冲区的目的是经过缓解运行程序上高层之间的性能差异 提高系统的性能 在日常生存中 缓冲的一个典型运行是漏斗 如图 所示
图缓冲的示用意
图 显示了漏斗作为缓冲区的经常使用场景 高层系统如茶壶 高层系统如水瓶 现须要将茶壶中的水倒入水瓶中 这就有如将内存中的数据写入硬盘中一样 茶壶的出水速度可以很快 然而水瓶的瓶口很细 因此构成性能瓶颈 要将水所有倒入瓶中 必定期待瓶口的水渐渐流下 为了加极速度 可以经常使用一个漏斗(缓冲)
漏斗的初始口径很大 并且领有必定的容量 因此 茶壶中的水可以先倒入漏斗中 就有如内存数据先写入一块缓冲区 只需漏斗的容量够大 茶壶里的水很快就能倒完 至此 高层系统成功上班 可以去处置其余业务逻辑 而此时 水并未齐全进入瓶中 而大局部被积攒在漏斗中 这就可以由高层系统渐渐处置 直到水齐全进入瓶中 漏斗(缓冲区)被清空
留意 缓冲可以协调高层组件和高层组件的性能差 当高层组件性能优于高层组件时 可以有效缩小高层组件对高层组件的期待期间
基于这样的结构 高层运行组件不须要期待高层组件实在地接受所有数据 即可前往操作 放慢了高层组件的处置速度 从而优化系统全体性能
缓冲最罕用的场景就是提高I/O的速度 为此 JDK内不少I/O组件都提供了缓冲配置 比如 当经常使用FileWriter时 启动文件写操作的代码如下
Writer writer = new FileWriter(new File( file txt ))
long begin=System currentTimeMillis()
for (int i = ; i < CIRCLE; i++) {
writer write(i)//写入文件
writer close()
System out println( testFileWriter spend: +(System currentTimeMillis() begin))
为启动I/O优化 可认为FileWriter加上缓冲
Writer writer = new BufferedWriter(new FileWriter(new File( file txt )))//参与了缓冲
long begin=System currentTimeMillis()
for (int i = ; i < CIRCLE; i++) {
writer write(i)
writer close()
System out println( testFileWriterBuffer spend: +(System currentTimeMillis() begin))
以上代码经常使用BufferedWriter为FileWriter对象参与缓冲配置 BufferedWriter对象领有两个结构函数
public BufferedWriter(Writer out)
public BufferedWriter(Writer out int sz)
前往目录 Java程序性能优化 让你的Java程序更快 更稳固
编辑介绍
Java程序设计培训视频教程
J EE初级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj//Javaio缓冲区为什么不间接开拓大空间
Javaio缓冲区不间接开拓大空间要素:有效地治理系统资源,繁难用户经常使用的程序汇合。
(操作系统是加在裸机上的第一层软件,是用户与计算机的接口)。
当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,假设缓冲区数据无余,才会再从文件中读取。
这里的缓冲区应该是在硬盘中。
经常使用BufferedWriter时,写入的数据并不会先输入到目的地,而是先存储至缓冲区中。
假设缓冲区中的数据满了,才会一次性对目的地启动写出。
这里的缓存区应该在内存中。
原理:
在Java类库中,IO局部的内容是很宏大的,由于它触及的畛域很宽泛:规范输入输入,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。