前言

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

最近,在开发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. eclipse下进行spark开发(已实践)

    开发准备: jdk1.8.45 spark-2.0.0-bin-hadoop2.7(windows下和linux个留一份) Linux系统(centos或其它) spark安装环境 hadoop-2. ...

  2. Ansible 系列之 Playbooks 剧本 (1)

    一.Playbooks 介绍 1.Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansible 模块 是你车间里的 ...

  3. 上传图片,多图上传,预览功能,js原生无依赖

    最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库 ...

  4. Yii前台后台登录混淆问题

    我们在用yii开发项目时候,如果前后台使用modules实现 那么 做登录时候用户名就会出现前后台登录混淆的事情 于是可以在adminModule.php文件中做个设置 public function ...

  5. Jemter+Badboy实战经验一(Badboy录制及基础功能)

    1. 使用工具: Apache Jemeter:http://jmeter.apache.org/download_jmeter.cgi (免费官网下载地址) BadBoy:   http://www ...

  6. 20ms Ac Code

    Rectangle Aread C Code #include <stdio.h> int computeArea(int A,int B,int C,int D,int E,int F, ...

  7. asp.net mvc源码分析-Route的GetRouteData

    我知道Route这里东西应该算路由,这里把它放到mvc里面有些不怎么合适,但是我想大家多数遇到路由都是在mvc的时候吧.首先我们还是来看看GetRouteData方法吧 [csharp] public ...

  8. ACM 阶乘的0

    阶乘的0 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 计算n!的十进制表示最后有多少个0   输入 第一行输入一个整数N表示测试数据的组数(1<=N< ...

  9. FineUIMvc随笔(6)对比WebForms和MVC中表格的数据库分页

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 通过对比WebForms和MVC中表格数据库分页代码的不同,可以对 MVC 中的数据流转有更加深入的了解. WebForms 中 ...

  10. mybatis基础学习4---懒加载和缓存

    1:懒加载 1)在主配置文件设置(要放在配置文件最前面) <!-- 延迟加载配置,两个都必须同时有 --> <settings> <!-- lazyLoadingEnab ...