代码编织梦想



在这里插入图片描述

在这里插入图片描述


运行时内存整体结构如下图所示:

在这里插入图片描述

在这里插入图片描述


1. 核心

● 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。
● Java 堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。
● 堆内存的大小是可以调节的。
● 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
● 堆,是GC ( Garbage Collection,垃圾收集器)执行垃圾回收的重点区域。
在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。


2. 堆的内部结构

现代垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:

在这里插入图片描述

2.1 年轻代与老年代

  • 存储在JVM中的Java对象可以被划分为两类:
    • 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速
    • 另外一类对象的生命周期却非常长,在某些极端的情况下还能够与JVM的生命周期保持一致。
  • Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(OldGen)
  • 其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间(有时也叫做from区、to区)。

在这里插入图片描述

  • 几乎所有的Java对象都是在Eden区被new出来的。
  • 绝大部分的Java对象的销毁都在新生代进行了。
    • IBM 公司的专门研究表明,新生代中 80% 的对象都是“朝生夕死”的。

3. 如何设置堆的内存大小

  • Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,大家可以通过选项”-Xmx”和”-Xms”来进行设置。

    • “-Xms”用于表示堆区的起始内存,等价于-XX:InitialHeapSize
    • “-Xmx”则用于表示堆区的最大内存,等价于-XX:MaxHeapSize
  • 一旦堆区中的内存大小超过“-Xmx”所指定的最大内存时,将会抛出OutOfMemoryError:heap异常。

  • 通常会将 -Xms 和 -Xmx两个参数配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小,从而提高性能。

  • heap默认最大值计算方式:如果物理内存少于192M,那么heap最大值为物理内存的一半。如果物理内存大于等于1G,那么heap的最大值为物理内存的1/4。

  • heap默认最小值计算方式:最少不得少于8M,如果物理内存大于等于1G,那么默认值为物理内存的1/64,即1024/64=16M。最小堆内存在jvm启动的时候就会被初始化。

3.1 如何设置新生代与老年代比例?

下面这参数开发中一般不会调:

  • 配置新生代与老年代在堆结构的占比。

    • 默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3\
    • 可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5
  • 可以使用选项 -Xmn 设置新生代最大内存大小

    • 这个参数一般使用默认值就可以了。

3.2 如何设置Eden、幸存者区比例?

  • 在HotSpot中,Eden空间和另外两个Survivor空间缺省所占的比例是8:1:1
  • 当然开发人员可以通过选项“-XX:SurvivorRatio”调整这个空间比例。比如-XX:SurvivorRatio=8

在这里插入图片描述



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aliyunyyds/article/details/138991262

jvm运行时内存结构_谈胖胖的博客-爱代码爱编程

主要结构:堆内存、方法区、栈(说明:基于JDK1.7) 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-H

一文搞懂jvm内存结构_涛声依旧叭的博客-爱代码爱编程_jvm内存结构

1. 前言 Java 虚拟机是中、高级开发人员必须修炼的知识,有着较高的学习门槛,很多人都不情愿去接触它。可能是觉得学习成本较高又或者是感觉没什么实用性,所以干脆懒得“搭理”它了。其实这种想法是错误的。举个最简单的例子,JVM 基本上是每家招聘公司都会问到的问题,它们会这么无聊问这些不切实际的问题吗?很显然不是。由 JVM 引发的故障问题,无论在我们开发

JVM初识:堆内存、栈内存-爱代码爱编程

Java中,内存分为两种,一种是栈内存,另一种就是堆内存 堆内存:是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放【对于堆内存一般开发人员会自动回收它】。 栈内存:是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量【栈

认识JVM和运行时内存-爱代码爱编程

认识JVM和运行时内存 基本概念:JVM运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收、一个堆、一个存储方法域。 JVM与硬件没有直接交互,运行在操作系统之上。 运行过程: Java源文件---->编译器---->字节码文件 字节码文件---->JVM解释器---->机器码 内存区域

初识JVM(JVM运行流程,JVM运行时数据区,内存布局中的异常)-爱代码爱编程

目录 🚗一. JVM概述 🚓二. JVM的运行流程 🚕三. JVM运行时数据区(面试常考重点) 🛹1. 堆区(线程共享) 🛼2. 虚拟机栈(线程私有) 🚲3. 本地方法栈(线程私有)  🛵4. 程序计数器(线程私有) 🏍️5. 方法区/元数据区(线程共享) 🚙四. 内存布局中的异常 🛹1. 堆溢出 🛼2. 栈溢出 🚗一. JVM

【JVM系列】JVM内存区域(JVM运行时数据区域)-爱代码爱编程

文章目录 一、基础知识二、运行时数据区内存划分堆虚拟机栈程序计数器方法区(元空间) 有志同道合的朋友可私信联系我,这些年攒下来一些的技术文档可免费分享一、基础知识 JVM是什么?   JVM是一种抽象的规范,规范我们的程序开发;JVM也是一个具体实现,即我们平常理解的一个软件;JVM还可以说是运行的虚拟机实例,即加载class文件并执行它里

jvm运行时占用的内存_jvm占用内存大小-爱代码爱编程

一个线上服务内存占用带来的问题 在Oracle官网给出的JVM调优文档中关于堆的调整技巧有以下三个方面: 1.应将堆大小设置为不超过最大可用物理RAM量。如果超过此值,操作系统将开始分页,性能会显着下降。VM总是使用比堆大

vc++6.0 sqlite3调用例子-爱代码爱编程

1,为什么要使用Sqlite3? SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。 2,为什么使用SQLite version 3.8.4.3 2014-04-03 16:53:12的版本 (1)dll体积小6

【jvm基础篇】jvm运行时数据区-爱代码爱编程

文章目录 运行时数据区应用场景一、程序计数器程序计数器的作用程序计数器会出现内存溢出吗? 栈二、Java虚拟机栈栈帧存放什么数据局部变量表字节码文件的局部变量表栈帧的局部变量表思考题:**以下代码的局