Jvm创建对象之内存分配-JVM(七)

这篇具有很好参考价值的文章主要介绍了Jvm创建对象之内存分配-JVM(七)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章介绍了jvm创建,会校验是否已加载类,没有则加载,通过之前学的源码,classLoader加载完之后,虚拟机开始给类分配内存,指针移动分配和free链表分配,解决并发分配情况用cap和TLAB方法。之后设置对象头部信息,有mark word线程锁,分代年龄等,klass pointer。还有指针压缩的概念。

Jvm对象创建-JVM(六)
  • 指针压缩的好处?
  1. 在64位平台的HotSpot使用,则会内存多使用一倍,占用较大带宽,gc也会压力增大。
  2. 堆内存小于4g(2^32)的时候会自动指针压缩。
  3. 堆内存大于32g的时候会指针压缩无效。

-XX:+UseCompressedClassPointer只会压缩klassPointer指针

  • 逃逸分析

当我们一个方法里面创建一个新的对象,如果这个对象return,则会在方法外部被调用,如果没有return,则只会在方法内部调用,这种则就称为方法逃逸。

第二种只在方法内调用,可以把他分配在栈内存里面,随着栈内存的回收一起被gc。

默认是开启逃逸分析,如果关闭则使用

-XX:-DoEscapeAnalysis

  • 标量替换,聚合量

当一个对象通过逃逸分析确定不会逃逸,也就是不会被外部调用时候,这时候jvm不会创建该对象,而是将该对象分解若干个方法使用成员变量替换,这样就不会因为一大块连续的内存空间而导致不够用。

Jdk1.7之后默认开启标量替换,关闭则使用

-XX:+EliminateAllocations

(标量就是不可拆分的量,比如int,long)标量对立就是可以被进一步分解的量,叫聚合量,可以被继续分解。

Jvm创建对象之内存分配-JVM(七),jvm

 

由上可以知道,我们是先在栈上分配,因为前面说的逃逸分析,标量替换,之后再往堆分配。

那栈里怎么会放那么多对象呢?

比如一个main方法里调用一个方法,这个main方法有一个大的栈空间,里面的方法会有一个栈帧空间,而这个方法结束的时候,线程会退出,这时候栈帧空间就会释放,所以后面就继续可以使用栈帧空间。

  • EDEN

如果对象太大,则会直接进入old代里。

Jvm创建对象之内存分配-JVM(七),jvm

 

我们需要在启动的时候加参数:-XX:+PrintGCDetails

这时候放入45M的数据(1024byte=1kb,1024kb=1m)

可以看到eden已经满了,eden区一共有50m的空间,足够放的下,YoungGen区从图中可以看到有60M的空间。

后面的from和to都是百分之0,oldGen也是百分之0。

Jvm创建对象之内存分配-JVM(七),jvm

 

我们再放入7M的数据让内存分配,这时候可以看到eden和from都有放。

放不下则放入oldGen老年代,老年代有45M左右。

前面的45M全部到老年代了,后面新进入的7M则在eden。

Jvm创建对象之内存分配-JVM(七),jvm

 

当我们再放3M进去可以看到,还是进入了eden。老年代放的还是刚刚的大对象。

对象是在eden分配的,当我们放不下的时候,会生成yongGC也就是MinorGC,新生代回收频繁,速度比较快。文章来源地址https://www.toymoban.com/news/detail-540946.html

到了这里,关于Jvm创建对象之内存分配-JVM(七)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JVM运行时区域——对象创建内存分配过程

    JVM运行时区域——对象创建内存分配过程

            新创建的对象 , 都存放在伊甸园区域 ,当垃圾回收时,将伊甸园区域的垃圾数据销毁,然后将存活的对象转移到幸存者0区域,之后创建的新的对象还是存放在伊甸园区域,等到再次垃圾回收后,将伊甸园区域和幸存者0区域中存活的对象一起转移到幸存者1区域中

    2024年02月15日
    浏览(12)
  • JVM 创建对象时分配内存的几种方法、分配方法的选择

            假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大小相等的距离。         如果Java堆中的内存并不是规

    2024年02月10日
    浏览(7)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(14)
  • JVM 给对象分配内存空间

    指针碰撞 空闲列表 TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞:(Bump The Pointer) 堆的内存是绝对规整的,内存主要分为两部分,所有使用过的内存被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点

    2024年02月11日
    浏览(9)
  • JVM对象在堆内存中是否如何分配?

    JVM对象在堆内存中是否如何分配?

    1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收集器时,系统采用的分配算法是

    2024年02月16日
    浏览(8)
  • JVM 垃圾回收详解之内存分配和回收原则+死亡对象判断方法

    JVM 垃圾回收详解之内存分配和回收原则+死亡对象判断方法

    当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收

    2023年04月19日
    浏览(12)
  • JVM的故事—— 内存分配策略

    堆内存有新生代和老年代,新生代中有一个Eden区和一个Survivor区(from space或者to space)。当有新的对象分配时,会优先分配在Eden区。当Eden区空间不足分配给新对象时,会进行一次minor GC,回收完没有引用的对象后,先考虑把一些Eden区的对象放到Survivor区,如果放不下,就放到老

    2024年02月10日
    浏览(9)
  • 深入理解JVM——垃圾回收与内存分配机制详细讲解

    深入理解JVM——垃圾回收与内存分配机制详细讲解

    所谓垃圾回收,也就是要回收已经“死了”的对象。 那我们如何判断哪些对象“存活”,哪些已经“死去”呢? 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加一;当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。 但是

    2024年02月12日
    浏览(11)
  • 四、JVM-对象内存模型

    四、JVM-对象内存模型

    一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出现的 开启了指针压缩 什么时候指针压缩会

    2024年02月14日
    浏览(11)
  • jvm对象内存划分

    jvm内存空间是逻辑上连续的虚拟地址空间(虚拟内存中的概念)映射到物理内存(不一定连续),物理内存不足时还会将物理内存中的数据交换到swap(磁盘的一块区域)。 这块水有点深,查阅资料做了个个人的总结。 内存划分,有 指针碰撞 和 空闲列表 这两种划分方式: 1、

    2024年02月07日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包