Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM内存—堆(heap)栈(stack)方法区(method) (转)

JVM内存—堆(heap)栈(stack)方法区(method) (转)

作者头像
翎野君
发布于 2023-05-12 07:53:42
发布于 2023-05-12 07:53:42
47900
代码可运行
举报
文章被收录于专栏:翎野君翎野君
运行总次数:0
代码可运行

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量及常量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AppMain.java

 public   class  AppMain                

//运行时, jvm 把appmain的信息都放入方法区

{

public   static   void  main(String[] args)  //main 方法本身放入方法区。

{

Sample test1 = new  Sample( " 测试1 " );   //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面

Sample test2 = new  Sample( " 测试2 " );

test1.printName();

test2.printName();

}

} 
Sample.java

 public   class  Sample        //运行时, jvm 把appmain的信息都放入方法区

{

/** 范例名称 */

private  name;      //new Sample实例后, name 引用放入栈区里,  name 对象放入堆里

/** 构造方法 */

public  Sample(String name)

{

this .name = name;

}

/** 输出 */

public   void  printName()   //print方法本身放入 方法区里。

{

System.out.println(name);

}

} 

【javac AppMain.java】将我们编写的java类转换成计算机jvm可识别的二进制的class文件

【java AppMain】注意执行的时候java命令后面不需要加.class

执行命令后:

1.启动了一个Java虚拟机进程,这个进程首先从classpath中找到AppMain.class文件,读取这个文件中的二进制数据,然后把Appmain类的类信息存放到运行时数据区的方法区中。

   这一过程称为AppMain类的加载过程。

2.Java虚拟机定位到方法区中AppMain类的main()方法的字节码,开始执行它的指令。这个main()方法的第一条语句就是:Sample test1=new Sample("测试1");

要求java虚拟机创建一个Sample实例,并且呢,使引用变量test1引用这个实例。

3.Java虚拟机一看,不就是建立一个Sample实例吗,简单,于是就直奔方法区而去,先找到Sample类的类型信息再说。结果呢,嘿嘿,没找到,这会儿的方法区里只有AppMain类但是还没有Sample类。可Java虚拟机也不是一根筋的笨蛋,于是,它发扬“自己动手,丰衣足食”的作风,立马加载了Sample类,把Sample类的类型信息存放在方法区里。

4.Java虚拟机做的第一件事情就是在堆区中为一个新的Sample实例分配内存, 这个Sample实例(指的是在堆中刚刚被分配了内存的实例)持有着指向方法区的Sample类的类型信息的引用。这里所说的引用,实际上指的是Sample类的类型信息在方法区中的内存地址,其实,就是有点类似于C语言里的指针啦~~,而这个地址呢,就存放了在Sample实例的数据区里。

5、 在JAVA虚拟机进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。OK,原理讲完了,就让我们来继续我们的跟踪行动!位于“=”前的test1是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,它被会添加到了执行main()方法的主线程的JAVA方法调用栈中。而“=”将把这个test1变量指向堆区中的Sample实例,也就是说,它持有指向Sample实例的引用

6.接下来,JAVA虚拟机将继续执行后续指令,在堆区里继续创建另一个Sample实例,然后依次执行它们的printName()方法。当JAVA虚拟机执行test1.printName()方法时,JAVA虚拟机根据局部变量test1持有的引用,定位到堆区中的Sample实例,再根据Sample实例持有的引用,定位到方法去中Sample类的类型信息,从而获得printName()方法的字节码,接着执行printName()方法包含的指令(按照上图箭头进行回溯理解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM内存模型
内存结构是JVM中比较重要的存储结构,是硬盘和cpu之间的桥梁,JVM的内存结构规定了程序在运行过程中的内存的申请,分配,管理等一系列策略,保证了程序的高效有序地进行。因为本人的JDK为1.8版本,因此我去百度了一下Java8的内存结构图,如下:
ma布
2024/10/21
1140
JVM内存模型
JVM系列(1) JVM内存模型,双亲委派机制和沙箱安全机制
今天来来聊一下JVM,JVM对于Java程序员来说十分重要,不说深入底层去研究JVM,最起码基本的模块这些要清楚,还有要学会分析一些基本的问题,比如OOM了,那么要知道怎么引起的,理解JVM的内存模型,有助于我们在编码时避免一些坑。
小四的技术之旅
2022/07/26
2940
JVM系列(1) JVM内存模型,双亲委派机制和沙箱安全机制
JVM之方法区
ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理
冬天vs不冷
2025/01/20
910
JVM之方法区
【Java】堆(heap)、栈(stack)和方法区(method)
栈:调用方法将在栈中开辟内存,称为入栈(压栈)。 栈内存存放基本类型值和引用数据类型的地址。 栈内存中的数据,没有默认初始化值,需要手动设置。 方法调用完成,栈内存立即释放,称为出栈(弹栈) 堆:用于存放使用new创建的对象或数组。 所有的对象都有内存地址值。 数据都有默认初始化值。 堆内存中的对象不再被指向时,JVM启动垃圾回收机制,自动清除。 方法区:与Java堆一样,是各个线程共享的内存区域。 存储已被Java虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等。 public class
陶然同学
2023/02/24
4760
【Java】堆(heap)、栈(stack)和方法区(method)
JVM内存结构
按照Java虚拟机规范的规定, JVM自动管理的内存将包括以下几个运行时的数据区域:
烟草的香味
2019/07/25
3790
堆、栈、方法区—JVM 内存模型分析
不论是正经或者不正经的程序猿要想变强不能光光变秃,你还必须掌握JVM相关的底层知识。
用户4464623
2020/09/10
5410
堆、栈、方法区—JVM 内存模型分析
面试官:说说JVM内存整体结构?
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。
鲁大猿
2024/01/04
2140
面试官:说说JVM内存整体结构?
JVM-方法区
ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理
utopia
2023/03/21
3240
JVM-方法区
内存中的栈(stack)、堆(heap)和方法区(method area)的用法
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空间;而通过 new 关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为 Eden、Survivor(又可分为 From Survivor 和 To Survivor)、Tenured;
小明爱吃火锅
2023/11/29
2790
JVM内存与垃圾回收篇第9章方法区
ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理
yuanshuai
2022/08/17
4120
JVM内存与垃圾回收篇第9章方法区
JVM内存区域认识
这是一张图🐰 区域介绍 程序计数器 程序计数器是一块较小的内存空间,它可以被看作是指示当前线程执行的字节码的行号指示器。(即记录当前的执行位置) 在虚拟机的概念模型里,字节码解释器就是通过改变计数器得之来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过轮流切换并分配处理器执行执行时间来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程种的指令。因此,线程为了切换后能恢复到正
高大北
2022/06/14
2230
JVM内存区域认识
jvm之方法区解读
官方文档:Chapter 2. The Structure of the Java Virtual Machine
一个风轻云淡
2023/10/15
2540
jvm之方法区解读
JVM-方法区
方法区概述 《Java虚拟机规范》中明确说明:"尽管所有额方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会去进行垃圾收集或者进行压缩",但是对于HotspotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆区分开,所以,方法区看做是一个独立于Java堆的内存空间
是小张啊喂
2023/02/21
3520
jvm入门4:09方法区
1方法区域对一样,是各线程共享的内存区域;2在jvm启动时被创建,实际物理内存空间中和java堆区一样都是不连续的;3大小可选择固定或扩展;4方法区的大小决定了可以保存多少类,方法区溢出,虚拟机会报内存溢出错误,outofmemoryerror:pergen space、metaspace,如加载大量的第三方jar包,tomcat部署的工程过多30-50个,大量动态的生成反射类;关闭jvm就会释放这个区域的内存
用户10832809
2025/02/25
1220
了解JVM内存模型
如果想了解JVM内存模型,首先我们要知道JVM是什么?JVM全称 Java Virtual Machine ,即Java虚拟机,是用于运行Java程序编译后的字节码文件。
烟雨星空
2020/06/16
5630
[二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
JVM全称是Java Virtual Machine  ,既然是虚拟机,他终归要运行在物理机上
noteless
2018/09/11
9590
[二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
深入理解JVM虚拟机---JVM内存管理
​ 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 ,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
俺也想起舞
2020/05/06
4440
JVM内存架构简述
运行时数据区绝对是JVM重中之重,因为业务中常用的内存调优就是在这个部分进行的 首先复习一下jvm的组成部分,中间这一块就是运行时数据区了, 数据区广义上可以分成两部分,堆和栈,其中栈是不会产生垃圾的,广义的堆包括方法区和堆,其中堆是gc所在的位置。之前的文章已经写过几篇类加载器的内容了,这一篇解释,当类以内存的形式加载进jvm后,是怎么被使用的。
燃192
2023/02/28
2740
JVM内存架构简述
jvm系列(二):JVM内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问
纯洁的微笑
2018/04/18
9520
jvm系列(二):JVM内存结构
绝了!华为技术专家居然把JVM内存模型讲解这么细致!
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。 JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨经典的JVM内存布局。
JavaEdge
2021/05/06
7060
绝了!华为技术专家居然把JVM内存模型讲解这么细致!
相关推荐
JVM内存模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档