前言

新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流!

最近,在开发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对象的内存模型(一)的更多相关文章

  1. Java对象的内存(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  2. 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

    一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...

  3. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

  4. java虚拟机的内存模型

    一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...

  5. JVM总结-java对象的内存布局

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...

  6. Java对象的内存布局

    对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...

  7. java对象在内存的大小

    前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...

  8. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  9. 10 Java 对象的内存布局

    Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...

随机推荐

  1. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...

  2. C#属性和字段

    属性 属性是一种用于访问对象或类的特性的成员.属性是字段的自然扩展,这两者都是具有关联类型的命名成员.而且访问字段和属性的语法是相同的.然而,与字段不同,属性不表示存储位置.相反属性具有访问器,这些访 ...

  3. Xcode插件包Alcatraz

    安装命令  curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh 终于可以了  这个其实 ...

  4. 对await(),notify()的理解

    await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子. public class Account { pri ...

  5. 理解WEB API网关

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. Entity Framework+SQLite+DataBaseFirst

    Entity Framework+Sqlite+DataBaseFirst 本篇主要是说明在vs中配置Sqlite,及使用Entity Framework DataBaseFirst模式. 如果没有下 ...

  7. 将Error异常日志从普通日志中剥离

    开发过程中经常需要调试和线上环境查看异常日志的需求,但普通消息与异常消息混在一起实在是非常难得找,上则NM的文档够你头痛,所以就将Error级别的日志抽离出来. 本示例采用log4net来配置: 1. ...

  8. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  9. Spark集群搭建_YARN

    2017年3月1日, 星期三 Spark集群搭建_YARN 前提:参考Spark集群搭建_Standalone   1.修改spark中conf中的spark-env.sh   2.Spark on ...

  10. Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写

    "./drivers/i2c/busses/i2c-s3c2410.c"是3.14.0内核中三星SoC的i2c控制器驱动程序, 本文试图通过对这个程序的分析, 剥离繁复的细节, 总 ...