• 栈(Stack)

    1.栈是线程私有的,其生命周期和线程相同。

    2.每个方法在执行的时候都会开辟一个栈区,同时创建一个栈帧(Stack Frame)。

    3.栈帧用于存储局部变量表,操作数栈,动态链接和方法出口等信息。

    4.局部变量表中存放两种数据类型:

    ​ ①基本数据类型:boolean ,byte, short, int , char, float , long, double。

    ​ ②引用数据类型:对象的引用,而非对象本身,比如 String s = new String() ,局部变量表中存放的就是 s , 而 new String() 是存放在堆中。此处的  s  是一个指向对象起始地址的引用指针。

    5.每个方法的调用到结束,对应着栈帧在虚拟机的栈中从入栈到出栈的过程。


  • 堆(Heap)

    1.堆是被所有线程共享的内存区域,在虚拟机启动的时候创建,是虚拟机中最大的内存块。

    1.堆是线程共享,也是虚拟机中最大的内存块,在虚拟机启动时创建。

    2.用于存放对象,几乎所有的对象都在这里分配内存。

    ​ (由于JIT编译器的发展和逃逸分析技术的成熟,栈上分配,标量替换使得并不是所有对象都在堆中分配。)

    3.堆是垃圾收集器管理的主要区域,有时候也叫做GC堆

    4.堆的内存在物理上不是连续的,速度较慢,但是逻辑上是连续的,分配灵活,可扩展。


  • 方法区(Method Area)

    1.方法区又叫静态区,是线程共享的内存区域。

    2.用于存储被虚拟机加载的类信息,字符常量,静态变量,静态方法。

    3.要求被加载的内容是不可变或者唯一的。(类信息,字符常量,静态变量等。)

    4.官方虽然把方法区描述为堆的一个逻辑部分,但是他并不是真正意义上完全属于堆,

    他还有一个名字Non-Heap。其目的就是为了和堆进行区分。


  • 运行时常量池(Runtime Constant Pool Table)

    1.是方法区的一部分。

    2.运行时常量池具有动态特性,在运行期间也可将新的常量送入常量池中,比如String类中 的inter()方法。


  • 说在最后

    1.码字不易,欢迎关注和转发,转发请注明出处,感谢支持。

    2.部分内容参考自《深入理解java虚拟机》一书。

浅析Java堆,栈,方法区的更多相关文章

  1. java 堆 栈 方法区的简单分析

    Java里的堆(heap)栈(stack)和方法区(method) 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创 ...

  2. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

  3. Java 底层机制(JVM/堆/栈/方法区/GC/类加载)

    转载:https://www.jianshu.com/p/ae97b692614e?from=timeline JVM体系结构 JVM是一种解释执行class文件的规范技术.   JVM体系结构 我翻 ...

  4. JVM堆 栈 方法区详解

    一.栈 每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成,每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧 只有在调用一个 ...

  5. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  6. [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程

    面向对象的内存分析 参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html :尚学堂JAVA300集-064内存分析详解_栈_堆 ...

  7. java中栈,堆,方法区

    最近在看面试题复习javaee,所以在这里对栈,堆,方法区做一下整理 参考了https://www.cnblogs.com/hqji/p/6582365.html 1.栈 每个线程包含一个栈区,栈中只 ...

  8. JVM之栈、堆、方法区(三)

    一.CPU和内存的交互 今天除夕,祝大家新年快乐,其实,我们知道的,我们的CPU跟内存会有非常频繁的交互,因为如果这个频繁的交互是交给我们的磁盘的话,那么随着我们的CPU运转速度越来越快,那么我们的磁 ...

  9. Java JVM——9.方法区

    前言 方法区是运行时数据区的最后一个部分: 从线程共享与否的角度来看: 大家可能在这里有些疑惑,方法区和元空间的关系到底是怎样的?请往下看,下面会为大家解惑. 栈.堆.方法区的交互关系 下面就涉及了对 ...

随机推荐

  1. spring boot使用注解的方式引入mybatis的SqlSessionDaoSupport

    出现这个问题, 说明一点, 我对spring的注解方式的配置只是知道一个皮毛. 没有深入理解. 有时间要把这部分充充电 package com.zhike.qizhi.common.dao; impo ...

  2. Hadoop之HDFS读写原理

    一.HDFS基本概念 HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而对于低延时数据访 ...

  3. mongodb存储二进制数据

    mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...

  4. Missing radix parameter 错误的解决办法

    下载了Mint-Ui的example,使用npm run dev时发现如下报错: ERROR in ./packages/loadmore/src/loadmore.vue ✘ http://esli ...

  5. C# - VS2019 WinFrm应用程序开发报表 - ReportViewer控件初涉

    前言 简单报表我们可以通过label.textBox和PrintDialog来实现,但是一般在实际生产过程中,用户的报表需求一般都是比较复杂的. 本篇主要记录对于传统中国式复杂报表的处理方法和解决思路 ...

  6. Django使用mysql数据的流程

    创建一个mysql数据库 1.打开终端(cmd): 输入: mysql -uroot -p 密码:*** 输入: create database 数据库名字; 2.在settings中进行配置 DAT ...

  7. Laravel 菜鸟的晋级之路

    第一阶段:简单的增删改查 这是最开始接触Laravel的一个阶段.如果有PHP经验,那么应该能很快找到MVC的路径,然后驾轻就熟的开始写起来.虽然还显得有些笨拙,不过很快就能做出一些内容了.如果没有P ...

  8. H3C交换机、路由器 ssh登录配置

    VLAN 10  创建vlan并配好ip inter vlan 10 ip add  20.1.1.1  24 qu ip route-static 0.0.0.0 0 20.1.1.254  写好静 ...

  9. python3 之 内置函数enumerate

    python3 内置函数enumerate一.简介: 该函数在字面上是枚举.列举的意思,用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列, 同时列出数据和数据下标,一般用在 for ...

  10. 2019-10-12,html+php+mysql简单留言板,作业

    php+mysql简易留言板,实现注册,登录,注销,查看留言,删除留言 1,index.html登录页面 代码: <!doctype html> <html> <head ...