首页 > 系统相关 >3. JVM 内存区域

3. JVM 内存区域

时间:2024-12-26 14:59:36浏览次数:7  
标签:虚拟机 区域 线程 内存 JVM 方法


JVM 内存区域主要分为线程 私有区域【程序计数器、虚拟机栈、本地方法栈】、线程共享区域堆、方法区】、直接内存

  • 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。
  • 线程共享区域随虚拟机的启动/关闭而创建/销毁。
  • 直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用DirectByteBuffer 对象作为这块内存的引用进行操作(详见: Java I/O 扩展), 这样就避免了在 Java堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。

1. 程序计数器(线程私有)

  • 保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空。
  • 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。

2. 虚拟机栈(线程私有)
又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。

3. 本地方法栈(线程私有)
与栈类似,也是用来保存执行方法的信息。执行Java方法是使用栈,执行Native方法时使用本地方法栈。

4. 堆(线程共享)
JVM内存管理最大的一块,被线程共享的一块区域,目的是存放对象的实例,几乎所有的对象实例都会放在这里,当堆没有可用空间时,会抛出OOM异常。
根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理。

5. 方法区(线程共享)
又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据。
1.7的永久代和1.8的元空间都是方法区的一种实现。
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
Java 虚拟机对 Class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。

标签:虚拟机,区域,线程,内存,JVM,方法
From: https://www.cnblogs.com/tim-zuo/p/18632857

相关文章

  • VC++申请和释放内存问题(常发生在C code 转 VC++时)
    注意看,VC++环境下,用malloc申请内存空间的代码如下:编译显示成功,但在执行释放内存代码free(p);free(q);时报错。经过分析发现,p是结构体linkqueue指针,linkqueue结构体中有两个指针变量front,rear,在队列为空时,front和rear都指向头节点q.点击查看代码linkqueuep=(li......
  • memmove函数:内存重叠时拷贝
    最近测试遇到一个memcpy在x86和arm平台上拷贝字节时不一致的问题。出现拷贝是memcpy函数少量字节拷贝错误。分析参考:https://blog.csdn.net/shuidaoqingyi520/article/details/131669163在内存有重合的时候memcpy是不稳定的,要使用memmove函数。我于是自己写了个简单代码对比#i......
  • 1. JVM概述
    基本概念JVM是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。运行过程我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,......
  • JavaScript中的数组和函数在内存分别是如何存储的?
    在JavaScript中,数组和函数在内存中的存储方式涉及到JavaScript的内存管理机制,特别是堆(Heap)和栈(Stack)的使用。虽然这些概念在底层实现上可能因JavaScript引擎(如V8,SpiderMonkey等)的不同而有所差异,但我们可以从一个高层次的视角来理解它们。1.数组在内存中的存储数组在JavaScript......
  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行......
  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总 1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行.......
  • Go 高级编程 三 内存模型
    内存模型并发编程模型:多线程、消息传递。从理论上来说,多线程和基于消息的并发编程是等价的。go语言是基于消息并发模块的编程语言,将基于CSP模型的并发编程内置到语言中,可以通过go关键字来启动一个goroutinego的goroutiune之间是共享内存的。Goroutinegoroutiune是一种轻量级......
  • 避坑指南:可能会导致.NET内存泄露的8种行为
    任何有经验的.NET开发人员都知道,即使.NET应用程序具有垃圾回收器,内存泄漏始终会发生。并不是说垃圾回收器有bug,而是我们有多种方法可以(轻松地)导致托管语言的内存泄漏。内存泄漏是一个偷偷摸摸的坏家伙。很长时间以来,它们很容易被忽视,而它们也会慢慢破坏应用程序。随着内存泄漏,你......
  • python多进程,通过内存共享来通信,使用进程锁来防止数据问题
    代码:importmultiprocessingimporttime'''使用锁和multiprocessing.Value,multiprocessing.Array,multiprocessing.Manager().list'''defworker1(shared_number1,lock):for_inrange(10):withlock:......
  • spark内存配置,你一定不能忽略的知识点
    前言Spark是一个强大的分布式计算框架,它可以处理大规模数据集,并通过内存缓存来提高计算性能。但如果不正确地配置Spark的内存,可能会导致缓存滥用和性能问题。本文将介绍如何有效地配置Spark的内存设置,以避免缓存滥用和提高性能。一、Spark内存配置在Spark中,内存主要用于两个......