热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

各种数据类型在jvm里的内存分配

jvm运行时数据区的简单介绍   JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。  其中本文涉及到的主要有:java虚拟机站(简称java栈),java堆和方法区。  这里简单地普

jvm运行时数据区的简单介绍

    JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。
    其中本文涉及到的主要有:java虚拟机站(简称java栈),java堆和方法区。
    这里简单地普及一下这三种数据区的知识,java栈的读取速度是最快的(紧次与CPU的寄存器,跨平台性比寄存器好,android使用的是寄存器),但是里面的数据内存大小是编译时就已经分配好的,在运行时都不会改变;java堆的速度没有java栈的速度那么快,但是java堆里面的数据内存大小不是固定的;前面两种都会被java的垃圾收集器清除废弃的内存;方法区对于Sun HotSpot来说,又称为“永久代”,虚拟机规范允许该区域可以选择不实现垃圾回收,相对而言,垃圾收集行为在这个区域比较少出现,该区域的内存回收目标主要针是对废弃常量的和无用类的回收。

基本数据类型

    在java中,基本数据类型有:字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean)。
    基本数据类型都有一个共同点,就是它们的字节大小已经本身就已经固定的,所以,它们所需要的内存空间也是固定的。
    根据上面jvm的简单介绍,基本数据类型实际上是放到java栈中的,这样可以保证基本数据类型的读取速度是最快的,而且基本数据类型用得也比较多。

对象实例及其引用

    对于对象实例,总所周知,它的内存大小是不确定的,而且它也经常需要被垃圾收集器回收内存,所以它实际上是放在jvm里的java堆中;
    对于引用类型(即对象引用),它的大小是固定的,而且在运行时需要快速找到引用,它实际上是放在jvm的java栈中。
    对于Object obj = new Object(); 在java堆中有两种实现方法,一种是在java堆中多实现了一个句柄池,句柄池中放入到对象实例数据的指针,即java栈中的引用指向java堆中句柄池中的对象实例数据指针,再拿到实例数据;另一种是java堆中没用句柄池,java栈中的引用直接指向java堆中的实例数据。两种实现对比:第一种实现多了一个中间过程,当对象实例数据地址移动了,java栈中的引用不用变,只变句柄池的指针就行了;第二种实现,少了一个指针指向过程,速度比第一种快,但对象实例数据地址移动了,java栈中的引用也要改变。
借用一篇博文的图片:第一种
 
第二种:


字符串类型

    String是一个特殊的对象,它的内存存放不用于普通对象类型。
    首先,它是一个常量,一旦确定好就不会再改变,如:String str = "erdangjiade" + "  " + "blog";  这句代码会将"erdangjiade"、"  "和"blog"分别放入jvm里面,再将"erdangjiade  blog"放入jvm里面。所以为什么用StringBuffer的原因是StringBuffer是可变的。
    讲了那么多,那么到底String是放去jvm哪里呢,如果从百度上找,会找到很多误导人的答案,字符串实际上是放在字符串常量池里面,字符串常量池是在常量池里面,而常量池是在方法区里面。所以字符串实际上是放在方法区里面的。
    但是字符串引用还是存放在java栈中,直接指向方法区的常量池。
    如果是new String("");  这种方法得到的字符串不是放入字符串常量池中,而是当成一个普通对象放在java堆中的,例子:
String str = "erdangjiade";
String newStr = new String("erdangjiade");
当判断str==newStr时,会返回false,因为它们的地址不一样。(普及一个知识:==是比较两个对象的地址,equal()是比较对象数据是否相等)
    方法区还存放被虚拟机加载的类信息,如:类类型,父类型,接口,方法及其方法参数等,反射中经常用到。所以方法区存放的数据特点是:静态的,基本的,共享的。


欢迎大家补充说明

参考文章:
兰亭风雨的【深入Java虚拟机】之一:Java内存区域与内存溢出
ZangXT的小例子:如何说明String常量池的位置



推荐阅读
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
  • 根据经济日报的报道,截至3月15日,包括抖音、今日头条、微信、淘宝、百度、大众点评、微博和小红书在内的多个主流App已经上线了算法关闭功能,用户可以在后台一键关闭“个性化推荐”。 ... [详细]
  • 拼多多的崛起之路
    随着4G通信技术的发展,互联网产品从PC端转向移动端,图像传输速度更快、更清晰,智能设备的应用提升了用户体验。移动互联网的普及为拼多多的崛起提供了时代背景。 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • 360搜索引擎上线,挑战谷歌市场地位
    360公司近日推出了自家的搜索引擎,将默认搜索从谷歌替换为360搜索。这一举动引发了国内搜索引擎市场的激烈竞争,可能对谷歌在中国的市场份额产生重大影响。 ... [详细]
  • 对于众多创业公司而言,选择小程序或小视频的发展方向至关重要。本文将深入分析小程序和小视频的特点、优势及局限,帮助创业者做出更明智的选择。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • R语言及RStudio的安装步骤详解
    本文详细介绍了如何正确安装R语言及其集成开发环境RStudio。首先,需要确保安装R语言的基础环境,然后再安装RStudio。虽然先安装RStudio在技术上可行,但为了遵循最佳实践,建议先安装R语言。以下是R语言安装包的下载链接。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文提供新旧BOM(物料清单)对比的操作步骤,包括下载地址和详细操作说明。通过本指南,您可以轻松完成BOM的对比工作。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • MySQL下载与安装指南:详细记录常见问题及解决方法
    MySQL下载与安装指南:详细记录常见问题及解决方法 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 如何拆解联想C4030一体机并安装额外内存条?
    收到一台朋友赠送的联想C4030一体机,这是一款面向家庭用户的入门级设备。其配置包括Intel i3处理器、4GB内存和500GB硬盘,整体性能较为有限。尽管如此,该机配备了一块1920x1080分辨率的高清IPS屏幕,显示效果尚可。为了提升性能,计划拆解机器并加装额外的内存条。 ... [详细]
author-avatar
妖精的尾巴的阿鲁哈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有