Java对象的内存(一)
前言
新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流!
最近,在开发App后台过程中,需要将项目部署到云服务器上。而云服务器的内存大小却只有1G。要如何做到较为合理的内存使用,由此引发了我的一些关于内存方面的疑问:
- 一个类的对象占内存多少?其大小由什么决定?
- Java类中过长的方法会不会影响类的对象大小?
- 将过长的方法封装会不会影响原来的运行速度?
一个或者多个Java对象的内存模型图
第一种比较简单的情况:
public class Boy{
private String name;
private int weight;
public void play() {….}
public static void main(String[] args){
Boy b = new Boy();
b.play();
}
}
这是一个简单的Java类,我们通过这个对象的创建、方法调用来简单了解Java对象的内存模型,如下图

上图的栈中每一个小方框代表一个栈帧,每当执行一个方法时,就会往JVM栈中压入一个栈帧。
而该栈帧用来保存参数、局部变量和一些其他的数据。
1)类的class文件会被读入JVM中的PermSpace中,为之创建一个java.lang.Class对象。当要在堆中创建实例对象时,会为该实例对象的class静态属性赋值
补充:什么是PermSpace?
是方法区中一块主要用来存放静态的类信息和方法信息,静态的方法和变
量,final标注的常量信息等等。另外该区域的内存不会被GC回收
2)当使用Boy这个类时,JVM会先在PermSpace中寻找是否有对应的class文件,如果还未被加载到内存中,则系统会通过加载、连接、初始化来对该类进行初始化。
3)boy对象运行时就需要找到其实例对象的地址,这个地址由哈希编码,并记录在JVM的一张表上。而调用对象的非静态方法时,也会有个相对应的方法地址(该词仅为了易于表达)指向PermSpace中的方法。
4)当该对象的引用变量b调用方法play时,会通过堆中的该对象的方法地址,找到相对应的方法,并最终往JVM的栈中在压入一个栈帧。执行完成相对应的方法后直接弹出该栈帧
第二种多个同类类型的对象的情况:
1)当有多个同类类型的Java对象时,尽管各个对象都有一套自己的不同状态的成员变量,但是它们的方法地址都是指向的PermSpace中的该类的方法代码。当调用对象的非静态方法时,该情况和上述的第(4)点类似
Java对象的内存(一)的更多相关文章
- Java对象的内存模型(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Java对象的内存布局
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- java对象在内存的大小
前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...
- java对象在内存中的分配
java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899
- 10 Java 对象的内存布局
Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...
- Java对象的内存布局以及对象的访问定位
一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...
- 3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...
- 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...
随机推荐
- Greedy- 621. Task Scheduler
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- 二:maven构建module
通常情况下,我们一个项目是需要分多个模块的,这是我们用maven管理项目就需要构建一个多模块的项目: 通常的结构是一个模块中有一个主项目,下面包含多个子项目,如果是web项目则子项目中有一个是java ...
- Chrome谷歌浏览器已停用不支持的扩展程序解决方法
在不能上外网的情况下解决该问题: http://www.liu16.com/post/Chrome_2447.html
- ffmpeg + nginx 搭建流媒体
//安装nginx rtmp 流媒体服务 1.安装nginx+rtmp模块 brew install nginx-full --with-rtmp-module 2.修改配置文件 /usr/loca ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- [经验]微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
- 剑指offer三十七之数字在排序数组中出现的次数
一.题目 统计一个数字在排序数组中出现的次数. 二.思路 解法一:遍历数组计数 解法二:考虑到时有序数组,所以采用分查找,找到第一个K 和 最后一个K的位置, 二者相减. 三.代码 解法一: publ ...
- GDAL VS2010 win7(64位)安装、使用说明(图文解析)
一.电脑配置及安装版本 Win 7(64位机) Visual Studio 2010 GDAL 1.9.2(我也尝试了最新版GDAL1.11.0,应该同样可以用的,只是在重新配置时又选用了老一点的版本 ...
- css网页布局 --- 左边固定,右边自适应
div的布局统一如下: <body> <div class="wrap"> <div class="left"></d ...
- 【树】Binary Tree Zigzag Level Order Traversal
题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...