Java中的JVM虚拟机内存分配详解

 更新时间:2023年10月24日 09:24:53   作者:ruan_luqingnian  
这篇文章主要介绍了Java中的JVM虚拟机内存分配详解,虚拟机是一种能够执行 Java 字节码的虚拟机,它是 Java 语言的核心组成部分,负责将 Java 代码转换为机器码并执行,JVM 提供了内存管理、垃圾回收、线程管理等功能,需要的朋友可以参考下

Java虚拟机内存分配

对象分配的规则有哪些

  • 对象主要分配在新生代的 Eden 区上
  • 如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配
  • 少数情况下也可能会直接分配在老年代中

GC参数指定垃圾回收

-Xms20 M、-Xmx20 M、-Xmn1 0 M 这 3 个参数限制了 Java 堆大小为 20 MB,不可扩展,其中 10 MB 分配给新生代,剩下的 10 MB 分配给老年代。-Xx: SurvivorRatio= 8 决定了新生代中 Eden 区与两个 Survivor 区的空间比例是 8:1

新生代与老年代

新生代 GC (Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度老年代 GC (Major GC/ Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,在 Parallel Scavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程)。Major GC 的速度一般会比 Minor GC 慢 10 倍以上。

在这里插入图片描述

大对象的分配和基本分配一样吗?

简介:堆内存JVM参数讲解,大对象分配原则讲解和代码验证

是什么?

  • 所谓的大对象是指,需要大量连续内存空间的 Java 对象,最典型的大对象就是那种很长的字符串以及数组
  • 虚拟机提供了一个-XX: PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制

实战代码演练大对象配置

  • -verbose:gc -XX:+PrintGCDetails 开启GC日志打印
  • -Xms20 M 设置JVM初始内存为20M
  • -Xmx20 M 设置JVM最大内存为20M
  • -Xmn10 M 设置年轻代内存大小为10M
-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728
package test;

/**
 * @Author: ruan
 * Date: 2021/7/25 10:07
 * @Description: 对象主要被分配在新生代中
 * 但对于一些大对象则被直接分配在老年代中
 */
public class TestMaxObject {

    public static void main(String[] args) {
        /**
         *设置新时代最大容量为3m时
         * 创建10m的大对象这会直接被分配在老年代中
         */
        byte[] bytes = new byte[1024 * 1024 * 10];
    }
}

在这里插入图片描述

逃逸分析和栈上分配

简介:堆内存分配方式,分配规则讲解

逃逸分析

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸

栈上分配

栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后自动销毁,而不需要垃圾回收的介入,从而提高系统性能

-XX:+DoEscapeAnalysis //开启逃逸分析(jdk1.8默认开启,其它版本未测试)
-XX:-DoEscapeAnalysis //关闭逃逸分析

到此这篇关于Java中的JVM虚拟机内存分配详解的文章就介绍到这了,更多相关Java虚拟机内存分配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成MyBatis对管理员的查询操作

    SpringBoot集成MyBatis对管理员的查询操作

    本文主要介绍了SpringBoot集成MyBatis对管理员的查询操作,实现增删改查中的查询操作,对所有的普通管理员进行查询操作,感兴趣的可以了解一下
    2023-11-11
  • java多线程之铁路售票系统

    java多线程之铁路售票系统

    这篇文章主要为大家详细介绍了java多线程之铁路售票系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 浅谈Java循环中的For和For-each哪个更快

    浅谈Java循环中的For和For-each哪个更快

    本文主要介绍了浅谈Java循环中的For和For-each哪个更快,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • SpringBoot配置系统全局异常映射处理

    SpringBoot配置系统全局异常映射处理

    在项目开发中,肯定少不了异常的出现,作为后台开发人员,我们总是在不停的写各种接口提供给前端调用,然而不可避免的,当后台出现BUG时,前端总是丑陋的讲错误信息直接暴露给用户,这样的用户体验想必是相当差的,本文主要讲解异常映射的配置
    2021-06-06
  • 一文读懂IDEA里面的Artifact到底是什么

    一文读懂IDEA里面的Artifact到底是什么

    这篇文章主要介绍了IDEA里面的Artifact到底是什么,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-01-01
  • Java中四种引用类型详细介绍

    Java中四种引用类型详细介绍

    这篇文章主要介绍了Java中四种引用类型详细介绍的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring依赖注入Dependency Injection的三种方式

    Spring依赖注入Dependency Injection的三种方式

    依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例
    2023-02-02
  • Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码

    这篇文章主要介绍了Java下http下载文件客户端和上传文件客户端实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码

    本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示流程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-01-01
  • Springboot 2.x RabbitTemplate默认消息持久化的原因解析

    Springboot 2.x RabbitTemplate默认消息持久化的原因解析

    这篇文章主要介绍了Springboot 2.x RabbitTemplate默认消息持久化的原因解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论