Java JVM内存区域详解

作者:聪明墨菲特 时间:2021-05-25 18:44:43 

原网页:JavaGuide

JVM在执行Java程序过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本略有不同,下面会介绍到。

JDK1.8之前

Java JVM内存区域详解

JDK1.8之后:

Java JVM内存区域详解

这其中线程私有的:

  • 虚拟机栈;

  • 程序计数器;

  • 本地方法栈;

线程共享的:

  • 堆;

  • 方法区;

  • 直接内存(非运行时数据区的一部分)

程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器完成。

Java虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是Java方法执行的内存模型,每次方法调用的数据都是通过栈传递的。

Java内存可以粗糙的分为堆内存栈内存,其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。(实际上,Java虚拟机栈是由一个个栈帧组成,每个栈帧中都拥有:局部变量表、操作数帧、动态链接、方法出口信息)。

局部变量表主要存放了编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象本身,可能是一个指向对象的起始位置的引用指针,也可能是指向一个代表对象的句柄或其他于此对象相关的位置)。

方法/函数如何调用?

Java栈可以类比数据结构中栈,Java栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入Java栈,每一个函数调用结束后,都会有一个栈帧被弹出。

Java方法有两种返回方式:

1、return语句。

2、抛出异常。

不管哪种返回方式都会导致栈帧被弹出。

Java虚拟机所管理内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。

Java世界中“几乎”几乎所有的对象都在堆中分配,但是随着JTI编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到对上也渐渐变得不那么“绝对”了。从JDK1.7开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。

Java堆是垃圾收集器管理的主要区域,因此也被称作GC堆。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代;进一步细致一点还有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

在JDK7版本以及JDK7版本之前,堆内存通常被分为以下三部分:

1、新生代内存

2、老生代

3、永生代

Java JVM内存区域详解

JDK8版本之后,方法区被移除了,取而代之的是元空间,元空间使用的是直接内存。

Java JVM内存区域详解

 大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。

来源:https://blog.csdn.net/weixin_51093884/article/details/121024628

标签:Java,JVM,内存区域
0
投稿

猜你喜欢

  • mybatis mybatis-plus-generator+clickhouse自动生成代码案例详解

    2021-06-06 10:12:55
  • Springboot 项目读取Resources目录下的文件(推荐)

    2023-07-27 09:40:47
  • 5分钟快速学会spring boot整合JdbcTemplate的方法

    2022-04-01 15:56:11
  • Android编程基础之获取手机屏幕大小(DisplayMetrics应用)示例

    2023-09-26 17:57:43
  • 通过Java连接SQL Server数据库的超详细操作流程

    2022-08-01 12:46:01
  • Spring Security实现自动登陆功能示例

    2023-01-29 15:31:55
  • Java数据结构及算法实例:三角数字

    2023-08-24 17:52:25
  • java 输入一个数字组成的数组(输出该数组的最大值和最小值)

    2023-11-24 21:41:58
  • java实战之猜字小游戏

    2022-03-31 14:48:01
  • Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    2023-11-04 02:20:26
  • java中MultipartFile互转File的方法

    2022-12-14 16:52:09
  • Java代码实现简单酒店管理系统

    2023-11-21 03:38:57
  • 解析spring cloud ouath2中的Eureka

    2023-10-12 04:07:54
  • Java基本语法之内部类示例详解

    2023-02-06 14:05:32
  • 使用开源项目JAVAE2 进行视频格式转换

    2023-11-08 07:18:24
  • Spring Boot利用JSR303实现参数验证的方法实例

    2022-07-28 20:36:26
  • 50 道Java 线程面试题(经典)

    2023-11-23 19:47:37
  • Maven插件的安装及使用

    2022-04-05 04:38:30
  • Java并发包之CopyOnWriteArrayList类的深入讲解

    2022-10-06 09:15:21
  • Java内存区域和内存模型讲解

    2023-11-26 12:08:39
  • asp之家 软件编程 m.aspxhome.com