[转帖]JVM 系列 - 内存区域

jvm,系列,内存,区域 · 浏览次数 : 0

小编点评

**对象在JVM中的表示:** * 对象是Java类Klass的实例。 * Klass包含元数据和方法信息,用于描述Java类OOP。 **JVM 系列 - 内存区域:** * 内存区域是JVM中用于存储对象的区域。 * 在分配对象实例时,对象会被分配到内存中的对象实例区域。 **java对象(准确来说是java实例,非基本类型)** * 虽然java对象不是基本类型,但它还是以对象实例的形式存储在内存中。 * 当创建对象时,对象会分配到内存中的对象实例区域。 **IO流如果没有被关闭,会不会造成OOM?** * 当IO流没有被关闭时,它会保持打开状态,并持续使用内存。 * 如果没有关闭流,方法执行完毕后,栈空间释放,对象实例和内存资源会被回收。 * 如果没有关闭流,操作系统也会报OOM错误。

正文

一、对象在JVM中的表示: OOP-Klass模型

https://www.jianshu.com/p/424a920771a3
写的很赞。
注意:OOP-Klass是hotspot的JVM实现原理,其他JVM的实现可能不一样。、
OOP表示java实例,Klass表示class。

Klass: 包含元数据和方法信息,用来描述Java类
OOP: Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象

二、JVM 系列 - 内存区域

https://www.jianshu.com/p/59f98076b382

三、java对象(准确来说是java实例,非基本类型),不一定都在堆上分配

一般认为java实例的创建,都会在堆上开辟内存创建实例。但是在堆上的哪个区,却是不一定的。比如:最常见是在Eden区分配,如果是Eden区不够(不够会触发一次Monitor GC 还不够)或者大对象(超过JVM配置),会在Old区分配。反正不够怎样,大概率情况会在堆上分配。但是有了JIT技术,一切都不一样啦。

这篇文章分析的很详细:参考文章:求你了,别再说Java对象都是在堆内存上分配空间的了!

四、IO流如果没有被关闭,会不会造成OOM?

首先需要明确,OOM是JVM的行为。只有JVM内存不足,才会报OOM。
我们先思考下IO流占用了哪些资源?如下代码:

private static void readNoClose(int num, String fileName){
        try{
            InputStream in = new FileInputStream(fileName);
            byte[] tempbytes = new byte[1024];
            int byteread = in.read(tempbytes);
            System.out.println("num=" + num + ",size=" + byteread);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

下面的代码,我们申请1M空间接收文件内容。但是我们把流in仅仅放在方法类。循环调用readNoClose方法。
上面这段代码,在方法执行期间,占用的资源有:

  1. 对象实例资源,属于JVM所有。
  2. 打开文件流所需的FD,属于操作系统所有。
    如果我们没有关闭流,方法执行完毕后,栈空间释放,in对象,tempbytes对象等等JVM堆里面的所有占用资源,都会被回收,只有占用操作系统的FD没法释放。因为操作系统的资源可不会像JVM那样,会扫描有没有引用。这里的资源,你不显示释放,它就不会释放。到这里,我们发现JVM所持有的所有对象都正确的释放掉了,所以JVM并不会发生OOM。

有人可能会问,不关闭会造成内存泄漏,内存泄漏会造成OOM。谁跟你说泄漏就会造成OOM?这里的泄漏,准确来说不是JVM内存泄漏,而是操作系统所在的内存泄漏。要泄漏也是非JVM管理的内存。JVM压根管不到,何来OOM。

上面代码泄漏的仅仅是FD,而FD占用内存很小。在还没来得及把内存泄漏满,操作系统就会报文件描述符太多,无法再创建。因为同一个文件上,所能打开的FD数量是有限的。
所以上面代码本地运行就会报如下错误。

java.io.FileNotFoundException: /Users/xxx (Too many open files)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)


作者:7d972d5e05e8
链接:https://www.jianshu.com/p/11d0714e380b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

与[转帖]JVM 系列 - 内存区域相似的内容:

[转帖]JVM 系列 - 内存区域

一、对象在JVM中的表示: OOP-Klass模型 https://www.jianshu.com/p/424a920771a3 写的很赞。 注意:OOP-Klass是hotspot的JVM实现原理,其他JVM的实现可能不一样。、 OOP表示java实例,Klass表示class。 Klass: 包

[转帖]JVM系列之:你知道Java有多少种内存溢出吗

本文为《深入学习 JVM 系列》第二十五篇文章 Java内存区域 关于这部分内容大多来源于《深入理解Java虚拟机》一书。 Java 运行时数据区域(JDK8)如下图所示: 关于上述提到的线程共享和线程隔离区域,下图做详细讲解: 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的

[转帖]【JVM系列JKD8】参数参考表

JVM是Java底层核心要素,可以说Java生态的东西都是运行在JVM里面的。From:https://docs.oracle.com/javase/8/docs/ JVM参数的含义 JVM参数说明 参数名称含义默认值-Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRat

【转帖】3.JVM内存结构概述

目录 1.JVM内存结构 1.JVM内存结构 在JVM系列的第一篇文章中已经给出了JVM内存结构的简图,下面是JVM内存结构更加详细的图。 同样,JVM的内存结构可以分为上中下3层。 上层主要是类加载子系统,负责将字节码文件加载到内存中。 类加载又分为具体的三个环节,加载(loading)、链接(l

[转帖]JVM系列之:深入学习方法内联

在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s

[转帖]JVM系列之:深入学习方法内联

https://zhuanlan.zhihu.com/p/487044559 在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用