首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏测试基础

    内存篇:JVM内存结构

    Java8相对之前的版本,JVM结构发生了较大的变化,取消了永久代,新增了元空间,同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。 下面,以Java8为例,对JVM结构做一番总结。 1 JVM结构详解 首先,看下最新的JVM结构图: ? Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。也就是说堆的内存是一块块拼凑起来的。 很多开发人员会把Java内存分为堆内存(Heap)和栈内存(Stack),这种划分的流行只能说明大多数开发人员最关注、与对象内存分配关系最密切的内存区域是这两块,其中所指的“堆”在后面会讲到,而所指的“ 小结 经过上面的讲解,想必大家已经了解到JVM内存结构的基本情况。下面对照脑图,归纳总结一下,看你能说出来多少。 ?

    7.9K33发布于 2020-09-16
  • 来自专栏开发笔记

    JVM内存结构

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 围城这个比喻过于形象!!! JVM内存区域 上经典图 【线程公有】:堆和方法区 【线程私有】:虚拟机栈,本地方法栈,程序计数器 堆 用于对象实例的内存分配,GC的主要区域。 方法区 存储已被虚拟机加载的类信息、常量、静态变量。 【符号引用转换为直接引用】 在编译时,比如People类的符号引用为com.simple.People,当类装载器装载People类后,符号引用被转为实际内存地址,也就是直接引用。

    59620发布于 2020-08-11
  • 来自专栏迁移内容

    JVM内存结构

    **主要结构:**堆内存、方法区、栈(说明:基于JDK1.7) 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor 在虚拟机规范中对本地方法栈中方法使用的语言、使用方式 与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。 此内存区域的唯一目的就 是存放对象实例,几乎所有的对象实例都在这里分配内存。 七、直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规 范中定义的内存区域。 服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略 直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制), 从而导致动态扩展时出现OutOfMemoryError

    44520编辑于 2022-12-01
  • 来自专栏空帆船w

    JVM 内存结构

    Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。 ? 这些区域中,一些是线程私有的,一些是线程共享的。 线程私有的:程序计数器、虚拟机栈、本地方法栈 线程共享的:堆、方法区、直接内存 1、程序计数器 一块较小的内存空间,用于标记当前线程所执行字节码的行号。 所有实例和数组都在这里分配内存,也是线程共享的内存区域。 -Xms 设置最小值;-Xmx 设置最大值。 堆内存分配会另写一篇文章介绍。 6、直接内存 直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。 jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

    62020发布于 2019-04-25
  • 来自专栏涓流

    jvm内存结构

    JVM内存结构概览 先来看一张图: jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的 堆区域 堆内存是JVM中最大的一块由新生代和老年代组成,而新生代内存又被分成三部分 TLAB仍然分配在堆上,结构比较简单,start、end就是起止地址,top表示已经分配到那里了,top与end相遇的时候,代表该缓存已经满了,JVM会试图再从Eden中分配一块 老年代 (old) , 这样在一些场景中显著提升内存, 避免了在java堆和native堆中来回复制数据 直接内存的分配不受java堆大小的限制, 但是配置虚拟机参数的时候要考虑到直接内存的存在, 不能让各个内存区域的总和大于物理机的内存 内存泄露: memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光 内存泄露处理方式 如果是内存泄露,可用 具体可以参考分析内存泄露的一般办法 内存溢出的处理方式 如果内存不泄露,也就是说,就是内存中的对象确实都还必须都活着,则: 检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大。

    1.3K20编辑于 2022-06-28
  • 来自专栏叽叽西

    内存结构简介

    Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存 用于存储局部变量,当数据使用完,所占空间会自动释放 堆(heap)内存 数组和对象,通过new建立的实例都存放在堆内存中。 每一个实体都有内存地址值 实体中的变量都有默认初始化值 实体不在被使用,会在不确定的时间内被垃圾回收器回收 方法区,本地方法区,寄存器

    28410编辑于 2022-05-17
  • 来自专栏烟草的香味

    JVM内存结构

    按照Java虚拟机规范的规定, JVM自动管理的内存将包括以下几个运行时的数据区域: ? 下面分别对几个数据区域进行说明: 1.程序计数器 程序计数器是JVM中一块较小的内存区域, 保存着当前线程执行的虚拟机字节码指令的内存地址. 所有虚拟机栈也是"线程私有"的内存区域. 这个栈中对应多个栈帧, 每调用一个方法就会往栈中创建并压入一个栈帧, 栈帧是用来存储方法数据和部分过程结果的数据结构, 每一个方法从调用到最终返回结果的过程, 就对应一个栈帧从入栈到出栈的过程. , 就会出现OOM 3.本地方法栈 本地方法栈和虚拟机栈的作用相似, 只是虚拟机栈是为Java方法服务的, 而本地方法栈是为Native方法服务的. 4.方法区 方法区是用来存储类结构信息(包括常量池、

    49020发布于 2019-07-25
  • 来自专栏Java架构师必看

    JVM 内存结构

    对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的delete/free 操作,不容易出现内存泄漏和内存溢出问题。 进一步划分的目的是更好地回收内存,或者更快地分配内存。 ? Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入Java栈,每一个函数调用结束后,都会有一个栈帧被弹出。 直接内存 ---- 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 异常出现。 本机直接内存的分配不会收到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。

    51220发布于 2021-05-14
  • 来自专栏房东的猫

    JVM:内存结构

    JVM的内存结构大概分为: ? 通过一张图来了解如何通过参数来控制各区域的内存大小 ? 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的是存放对象实例。Java世界里"几乎"所有的对象实例都在这里分配内存。所有的对象实例以及数组都应当在堆上分配。 直接内存(堆外内存) 直接内存并不是虚拟机运行时数据区的一部分,也经常被频繁的使用,而且也可能导致OutOfMemoryError 异常。 直接内存的分配不受Java堆大小的限制,但是,既然是内存则肯定还是会受到本机总内存的限制。 服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。

    96921发布于 2021-02-18
  • 来自专栏有来技术

    JVM内存结构

    说到java内存结构,不得不说下java内存模型,面试中可能经常会混淆,面试官问你的JAVA内存模型,可能人家想听到的是堆、栈、方法区等此类的关键词,只不过表述的有些问题,进而影响你的回答,所以在回答问题之前 ,一定先问清楚是内存结构内存模型。 主要区别,java内存结构是对内存的具体划分,java内存模型是解决多线程下工作线程和主线程数据不一致问题而提出的抽象规则。 java内存结构简单划分如下图所示,以下结构是java8之前版本,在java8里元空间取代了之前版本的方法区 可以看到java内存主要划分线程共享(堆、方法区),线程私有(程序计数器、虚拟机栈、 对象作为这块内存的引用,避免在Java堆中和直接内存来回复制数据,实现零拷贝,显著提高性能

    48030编辑于 2023-04-28
  • 来自专栏服务端技术杂谈

    CPU内存结构

    开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 ? ? CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周期指的是机器码的0和1的变化,是电信号的一高一低的变化是10纳秒左右,1s相当于10的9次方纳秒。 缓存某个缓存行和主存数据的不一致,该缓存行需要在未来某个时间点回写主存,回写之后状态变为(exclusive 独享) E:(exclusive 独享)CPU缓存中的某个缓存行和主存数据一致,处于这个状态的可以被其他CPU读取内存时变成 总线锁 MESI协议之前,解决缓存一致性方案是总线锁机制,这种方案比较低效,锁期间,其他CPU无法访问内存。 CPU乱序 多核时代,处理器为提高运算速度,可能作出违背代码原有初衷的行为。 解决这种问题的方式就是内存屏障,简单点说是不同的处理器架构提供了不同指令集用来建立内存屏障,这样控制不可乱序。

    2.4K10发布于 2019-03-14
  • 来自专栏Java学习专栏博客

    JVM 内存结构

    JVM 内存结构Java 虚拟机的内存空间分为 5 个部分:程序计数器Java 虚拟机栈本地方法栈堆方法区图片JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。 分离对象或标量替换:有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在 CPU 寄存器中。 图片直接内存(堆外内存) 直接内存是除 Java 虚拟机之外的内存,但也可能被 Java 使用。操作直接内存在 NIO 中引入了一种基于通道和缓冲的 IO 方式。 直接内存与堆内存比较直接内存申请空间耗费更高的性能直接内存读取 IO 的性能要优于普通的堆内存直接内存作用链: 本地 IO -> 直接内存 -> 本地 IO堆内存作用链:本地 IO -> 直接内存 -> 非直接内存 -> 直接内存 -> 本地 IO 服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError

    42730编辑于 2023-06-30
  • 来自专栏落叶飞翔的蜗牛

    JVM 内存结构

    直接内存(堆外内存) 直接内存是除 Java 虚拟机之外的内存,但也可能被 Java 使用。 操作直接内存 在 NIO 中引入了一种基于通道和缓冲的 IO 方式。 直接内存的大小不受 Java 虚拟机控制,但既然是内存,当内存不足时就会抛出 OutOfMemoryError 异常。 直接内存与堆内存比较 直接内存申请空间耗费更高的性能 直接内存读取 IO 的性能要优于普通的堆内存。 直接内存作用链:本地 IO -> 直接内存 -> 本地 IO 堆内存作用链:本地 IO -> 直接内存 -> 非直接内存 -> 直接内存 -> 本地 IO 服务器管理员在配置虚拟机参数时,会根据实际内存设置 -Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。

    78420发布于 2021-04-23
  • 来自专栏服务端技术杂谈

    CPU内存结构

    开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 ? ? CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周期指的是机器码的0和1的变化,是电信号的一高一低的变化是10纳秒左右,1s相当于10的9次方纳秒。 缓存某个缓存行和主存数据的不一致,该缓存行需要在未来某个时间点回写主存,回写之后状态变为(exclusive 独享) E:(exclusive 独享)CPU缓存中的某个缓存行和主存数据一致,处于这个状态的可以被其他CPU读取内存时变成 总线锁 MESI协议之前,解决缓存一致性方案是总线锁机制,这种方案比较低效,锁期间,其他CPU无法访问内存。 CPU乱序 多核时代,处理器为提高运算速度,可能作出违背代码原有初衷的行为。 解决这种问题的方式就是内存屏障,简单点说是不同的处理器架构提供了不同指令集用来建立内存屏障,这样控制不可乱序。

    1.9K20发布于 2019-05-05
  • 来自专栏空帆船w

    JVM 内存结构

    Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。 ? 这些区域中,一些是线程私有的,一些是线程共享的。 线程私有的:程序计数器、虚拟机栈、本地方法栈 线程共享的:堆、方法区、直接内存 1、程序计数器 一块较小的内存空间,用于标记当前线程所执行字节码的行号。 所有实例和数组都在这里分配内存,也是线程共享的内存区域。 -Xms 设置最小值;-Xmx 设置最大值。 堆内存分配会另写一篇文章介绍。 6、直接内存 直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。 jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

    1K30发布于 2019-01-28
  • 来自专栏全栈程序员必看

    JVM之JVM运行时内存结构, JDK1.7 JVM内存结构, JDK1.8 JVM内存结构, JVM堆内存结构

    1 JDK1.7结构 1.1 JVM内存图 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令. 方法区: 线程共享的(所有的线程共享一份), .class的信息, 类的信息, 方法的定义, 常量池, 静态变量等. 1.2 JDK1.7 堆内存结构 Young 年轻区(代) Young区被划分为三部分 Virtual区: 最大内存和初始内存的差值,就是Virtual区。 这里提到的GC咱们后续继续介绍~ 2. JDK1.8 结构 2.1 JVM运行时内存图 JDK1.8和JDK1.7的jvm内存最大的区别是, 在1.8中方法区是由元空间(元数据区)来实现的,常量池移到堆中. 1.8不存在方法区,将方法区的实现给去掉了 元空间: 存储.class 信息, 类的信息,方法的定义,静态变量等.而常量池放到堆里存储 2.2 JDK1.8堆内存结构 由上图可以看出,jdk1.8的内存模型是由2部分组成, 年轻代+年老代.

    1.2K10编辑于 2022-09-02
  • 来自专栏Reck Zhang

    Java 10 - 内存模型

    内存模型 主存储器与工作存储器 主存储器 方法区(Method Area) 方法区用于存储类的信息, 常量, 静态变量, 即时编译器编译后的代码. 当方法区无法满足内存分配需求时, 将抛出OutOfMeoryError. 堆(Heap) 堆在虚拟器启动时创建, 是JVM所管理的内存中最大的一块, 主要用于存放对象实例, 几乎所有的对象实例都在这里进行分配. 这也是GC的主要区域, 因此也教做GC堆, 如果堆中没有内存完成实例分配, 堆也无法进行扩展时, 将会抛出OutOfMemoryErrir异常. 栈(Java Virtual Machine Stacks) 代表着Java方法执行的内存模型, 每个方法执行时都会创建一个栈帧来存储方法的变量表, 操作数栈, 动态链接方法, 返回值, 返回地址等信息

    37720发布于 2021-08-11
  • 来自专栏来自csdn的博客

    结构体:内存对齐

    然而,当我们深入研究结构体时,会发现一个有趣且重要的现象:结构体的内存对齐。内存对齐直接影响到程序的性能和内存使用效率。今天,我们就通过一个简单的程序来深入探讨结构体的内存对齐。 知识点分析 结构内存对齐的基本概念 在C语言中,结构体是由多个成员组成的复合数据类型。每个成员都有自己的内存地址和大小。为了提高内存访问的效率和硬件性能,编译器会对结构体的成员进行内存对齐。 假设我们有一个结构体,用于存储学生信息: struct stu { char name[10]; // 10字节 int age; // 4字节 float score ; // 4字节 }; 如果没有内存对齐,结构体的总大小是10 + 4 + 4 = 18字节。 然而,由于内存对齐规则,编译器会在char name[10]和int age之间插入2字节的填充,使得int age的地址是4的倍数。因此,结构体的总大小是10 + 2 + 4 + 4 = 20字节。

    49010编辑于 2025-03-09
  • 来自专栏嵌入式学习

    结构内存对齐

    #include <stdio.h> #include <string.h> #include <malloc.h> /* So, when you are working with image headers, binary headers, and network packets, and are trying to access the TCP/ IP header, structure padding has to be avoided. */ int main(int argc, char* a

    76620发布于 2020-09-07
  • 来自专栏全栈程序员必看

    JVM内存结构概述

    本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。 JVM内存结构概览 我们先看下下面这张图(这张图非常重要!非常重要!非常重要!) Java虚拟机栈的结构如下图所示:Java虚拟机栈的生命周期与线程一致,一个方法对应一块栈帧内存区域,栈帧中包含局部变量表、操作数栈、动态链接、方法出口等信息。 int a=3; int b=5; int c=(a+b)*10; return c; } public static void main(String[] args) { 关于JVM的内存结构本节先做了一个大概的介绍,其中还有很多细节没有介绍:栈帧中的各个组成部分分别是干什么用的,堆内存的划分,对象是如果从新生代到老年代的,为什么要分代收集,垃圾收集算法有哪些,垃圾收集器有哪些

    40120编辑于 2022-09-06
领券