Java对象内存管理
对象内存管理介绍
编译好的java程序需要运行在JVM中;JVM为java程序提供并管理所需要的内存空间:“栈”、“堆”、“方法区”三个区域,分别用于存储不同的数据。

堆
存储new关键字所创建的对象。存储成员变量。
访问对象需要一个引用变量,当一个对象没有任何的引用时,即视为被废的对象,属于被回收的范围,该对象中所有的成员变量也随之被垃圾回收机制回收。
所以成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束。
当你创建一个对象的时候,对象放在堆中,栈中存放了一个地址,地址指向对象,
当创建基本数据类型时,直接在栈中存放。
栈
- 存储局部变量(在方法中声明的变量)
- 一个java程序从开始到结束会有多次方法的调用;JVM会为每一个方法的调用在栈中分配一个对应的内存空间--栈帧;一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据,当某个方法调用完成后,其对应的栈帧被清除,局部变量失效。
方法区
- 存放类的相关信息,java程序运行时,首先会通过类加载器载入类文件的字节码文件信息,经过解析后将其装入方法区中,类的各种信息(包括方法、类的静态成员变量)都在方法区存储。
- 类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中一份方法定义的。
- 每个对象所共享的东西。
常量池
常量池分为两种:静态常量池和运行时常量池。
静态常量池
- 静态常量池指的是在编译期确定,保存在class文件中的一些数据。
- 常量池主要用于存放两大类常量:字面量(Literal)和符号引用量。
- 字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等。
- 符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
1、类和接口的全限定名;
2、字段的名称和描述符;
3、方法的名称和描述符。
运行时常量池
- 在运行时常量池是方法区的一部分,在JDK1.7之后运行时常量池从方法区中移出,放在堆中。
- 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
成员变量和局部变量的区别
- 普通成员变量是属于对象的,声明在类中,而局部变量是属于方法的。
- 成员变量有默认值(基本数据类型为...,引用数据类型默认值为null),局部变量没有默认值,在第一次使用时必须初始化。
- 生命周期不同。成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束;局部变量的生命周期:方法被调用开始到调用完成结束。
Java对象内存管理的更多相关文章
- Unit03 - 对象内存管理 、 继承的意义(上)
Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的 1)堆: 1.1)存储所有new出来的对象(包含成员变量) 1.2)没有任何引用所指向的对象就是垃圾 ...
- Java的内存管理与内存泄露
作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...
- 让你第一次认识到Java的内存管理
发现之前写的可读性不好,这次准备试试换风格,去掉长篇大论,觉得这个风格好的,麻烦点个赞啦 清理.JVM的妙处 大家以后都是程序员,假设你很不幸,需要自己交钱租房子. 你作为一个小穷人,租的房子到期了( ...
- Java对象内存布局
本文转载自Java对象内存布局 导语 首先直接抛出问题 Unsafe.getInt(obj, fieldOffset)中的fieldOffset是什么, 类似还有compareAndSwapX(obj ...
- Java对象内存模型
2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...
- Objective-C 【多个对象内存管理(野指针&内存泄漏)】
------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...
- Objective-C 【单个对象内存管理(野指针&内存泄露)】
------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...
- Ehcache计算Java对象内存大小
在EHCache中,可以设置maxBytesLocalHeap.maxBytesLocalOffHeap.maxBytesLocalDisk值,以控制Cache占用的内存.磁盘的大小(注:这里Off ...
- JAVA 对象内存结构
JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...
- oc48--多个对象内存管理练习
// // main.m // 多个对象内存管理练习 // // ARC是Xcode帮我们生成内存释放的代码,MRC是需要我买自己写retain和release.想研究内存管理只能在MRC,管理对象就 ...
随机推荐
- Python 错误:ModuleNotFoundError: No module named 'conf'
问题描述: 编译器无法使用cmd命令来执行py文件,结果可能报ModuleNotFoundError的错误. 比如在cmd任务栏执行:python E:\myProgram\Python\spider ...
- Python 错误:TypeError: range() takes no keyword arguments
问题描述: for循环时使用range()出错: for page in range(start=1, stop=8 + 1,step=1): print(page) 结果报错TypeError: r ...
- ESP32(WeMos D1 R32)开发资料
1.乐鑫官网 2.ESP32踩坑 ESP32控制摇杆,定义sw的引脚时一定要设置为上拉才行. 3.ESP32入门之arduino IDE环境搭建 4.ESP32 MicroPython编程官网文档 E ...
- 说一说webpack的配置文件
可能有一些友友会奇怪为什么在写webpack的配置文件的时候,我们只能用commonJS导出. 原因:在打包的时候需要运行webpack的配置文件里面的代码,而webpack在打包运行的环境在node ...
- python 前言
# python前言简介: ## 文件的概诉 ```py# 什么是文件 .文件夹? 其实是操作系统暴露给用户可以简单快捷操作硬盘的"接口"``` ## 计算机内部储存数据的原理 ` ...
- Crypto入门 (七) Railfence (栏栅密码,正常型和W型)
前言: Crypto中分三类,分别是编码.古典密码.现代密码,栏栅密码属于古典密码中得特殊移位密码,密钥只有 一个k,表示栏栅得长度.所谓栏栅密码就是将要加密得明文分成k个一组,然后取每组得第一个字符 ...
- 盒子模型和CSS背景和列表
盒子模型(1)宽度-width:长度值 | 百分比 | auto-max-width:长度值 | 百分比 | auto-min-width:长度值 | 百分比 | auto(2)高度-height:长 ...
- ASP.NET WEBAPI oken验证
看了下网上关于.net webAPI 的案例全是坑 验证成功了不被微信服务器接收 微信客服有找不到,提问也没人回 自己测试好几个小时 终于发现返回结果只要个string 双引号都不用加 public ...
- 在.NET中使用JWT
1.配置文件添加 //jwt配置文件 "JWT": { "SigningKey": "14fa5f2rrwsg627fs256fdgff2r5rf52 ...
- Postman请求Https接口与认证
http://t.zoukankan.com/embedded-linux-p-12656769.html