Java内存分配主要包括以下几个区域:

寄存器

最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.。

存放基本类型的变量数据和对象的引用(就是一个名字),对象本身不存放在栈中,而是存放在堆或者常量池中。栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。栈区内存由编译器自动分配释放,具体方法执行结束之后,系统自动释放JVM内存资源。

存放所有new出来的对象或数组。堆内存中的对象对所有线程可见,可以被所有线程访问。jvm不定时查看堆中的对象,如果没有引用指向这个对象就回收。

方法区

只是JVM规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。而永久代是Hotspot虚拟机特有的概念,是方法区的一种实现,别的JVM都没有这个东西。

静态域

存放静态成员(static定义的) 。

常量池

存放字符串常量和基本类型常量(public static final)。

非RAM(随机存取存储器)存储

硬盘等永久存储空间。

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

1.声明和实例化

声明:A a=null ,声明一个A类的对象a,a放在栈中。

实例化:a=new A() ,实例化这个对象a,new A() 放在堆中。

String s= newString("a")创建了两个对象,一个是在常量池中,一个是在堆内存中,常量池的为"a",堆内存中为new String()。变量s指向该new string()对象,而该对象又指向在常量池中的字符串常量”a”。注意的是,在new的时候java虚拟机先去内存的常量池中查找”a”这个对象,如果有就不创建了,直接把堆中的对象指向该字符串。

String s="a"的意思就是在栈中创建一个字符串类型的变量s,并且变量s直接指向常量池中的字符串对象”a”,省去了中间的堆内存中的对象。注意的是,String s = "a",这行代码被执行的时候,java虚拟机首先在字符串池中查找是否已经存在了值为"a"这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

String s1=”china”

String s2=”china”

String s3=”england”

String s4=new String(“china”)

String s5=new String(“england”)

对于字符串,其对象的引用(这里指:s1,s2,s3,s4,s5)都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期new出来的(一旦new就会开辟新的堆内存)才存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

3. 数据存放位置

int s1=6; s1存放在栈中;6存放在常量池

char s2 = 'g'; s2存放在栈中;'g'存放在常量池

boolean flag = true; flag存放在栈中;true存放在常量池

byte b = 6; b存放在栈中;6存放在常量池

String s3 = "china"; s3存放在栈中;"china"存放在常量池

String s4= new String("abc"); s4存放在栈中;new String()存放在堆中;"abc"存放在常量池中

注意:

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

java堆和栈 常量池_Java中栈、堆和常量池相关推荐

  1. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  2. java构造单例线程池_java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

  3. java字面量和符号引用_java中字面量,常量和变量之间的区别(附:Integer缓存机制)...

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  4. 浅谈线程池(中):独立线程池的作用及IO线程池

    在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...

  5. 什么是java中的栈和堆_java中的堆和栈是什么?堆和栈有什么区别?

    java中的堆和栈是什么?堆和栈有什么区别? 发布时间:2020-06-02 11:51:19 来源:亿速云 阅读:183 作者:Leah java中的堆和栈是什么?堆和栈有什么区别?这些问题可能是我 ...

  6. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  7. java堆是什么_java中的堆是什么意思?

    java中的堆是什么意思? 发布时间:2020-06-10 19:27:03 来源:亿速云 阅读:198 作者:鸽子 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中 ...

  8. java判断栈空_java中栈的应用-判断分隔符是否合理

    栈是软件系统应用最广泛的数据结构之一,只要涉及先进后出的处理特征都可以使用栈结构. 例如:函数递归调用中的地址和参数值的保存,文本编辑器中序列的保存,在编译软件设计中的括号匹配及表达式求值,网页访问历 ...

  9. java中数据库连接池_Java中的数据库连接池

    本文译自Baeldung的博客 概述 连接池是一种众所周知的数据库访问模式,主要目的是减少创建数据库连接和读/写数据库操作的开销. 简单来说,连接池本质上就是数据库连接缓存的一种实现方式,可以通过对其 ...

  10. java判断对象已经被回收_Java中JVM判断对象已死的基本算法分析

    原标题:Java中JVM判断对象已死的基本算法分析 jvm中 有各种的垃圾收集器,每个收集器都有各自的算法. 但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础 ...

最新文章

  1. One order里user status和system status的mapping逻辑
  2. Adobe (Acrobat)Reader 6.0以上版本支持对有特殊权限的PDF进行添加注释,填写标单以及保存的功能。...
  3. v-for中用elementUI实现分页
  4. oracle的共享内存段,oracle共享内存段手工清理
  5. Longest Common Substring($LCS$)
  6. 【WordPress】小卡的土豆园开张
  7. BP神经网络模型---第一篇(M-P模型)
  8. js 手机号码正则
  9. c# AD域 权限管理
  10. 屌炸天,像写代码一样写PPT,reveal-md 详解
  11. LBS(基于位置服务)常见定位技术综合分析
  12. 一些网址备忘 (在线剪辑音频、在线工具箱、全网音乐下载)
  13. Unity 用ml-agents机器学习造个游戏AI吧(2)(入门DEMO)
  14. 暗月渗透实战靶场-项目七(上)
  15. 学小易有微型计算机接口答案吗,学小易接口更新+新的接口+成品
  16. 华益血糖信息管理系统服务器,华益血糖信息化管理系统
  17. IEC61499开源项目FORTE部分源码分析
  18. java获取指定周的第一天和最后一天(周统计报表)
  19. 练习c语言怎么修改字体为宋体,u8g2如何显示中文?如何显示楷体,宋体?
  20. 高效学习方法论 学习笔记

热门文章

  1. Java中获取时间戳三种方式
  2. 您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX AVX2
  3. 金融大数据风控建模实战(一)智能风控背景
  4. SENSOR DVP接口介绍
  5. 微信小程序轮播图,图片自适应,图片循环播放,图片之间有空白空间
  6. 手游中控台多开脚本实战
  7. 5款精美APP原型设计模板,触手可得
  8. 如何让微信好友永远拉黑不了你?
  9. [PowerQuery]Excel 如何开启PowerQuery组件
  10. 全国各地车牌代码整理出数据库表SQL Server