近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点。写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解决的java关于内存方面的困惑点。二来也是给自己做个总结,毕竟只有自己亲自写出来的东西,才是真正的东西。今天就开始java程序执行过程内存分析系列第一篇。

一、 java执行程序时内存的划分

一般来说,作为初学者,一般只是将java程序的内存只是分为栈区,和堆区。确实刚开始学时这样划分能都便于我们理解,但是随着学习java时间的增多,如果内存划分还只是简单的只有栈和堆两个区,就有很多东西不能深入理解,就拿个常用的字符来说,就很难理解字符串的一些特性。于是乎我这里就增加一个内存区域的划分,这样比以前能理解更多的东西。这个新增的内存区域是什么呢?其实也不是新增,就是把以前堆内存划分为方法区和其他区。那方法区里面存放些什么东西勒,方法区里面主要存放三个东西,第一个是程序的代码,第二个是常量池,这里主要存放一些java程序中的一些常量和字符串常量,第三个是静态的变量。堆内存划分如图所示。

二、.一个java程序执行过程中的内存分析

  首先我定义了一个people类,里面有姓名和性别两个成员变量和一个说话的成员方法。另外还有一个测试类,测试people类,好了,万事俱备,只欠东风了。下面正式开始内存分析。

 public class People {
String name;//定义一个人的姓名
String sex;
public void speak(){
System.out.println("hi 你好");
} }
 public class Test {
public static void main(String[] args) {
People p = new People();
System.out.println(p.name);
System.out.println(p.sex);
p.speak();
}
}

在程序开始运行时,执行的命令是 java Test(eclipse 刚开始也是要执行这句命令,就是在执行运行的命令时,就是在执行java Test),这时jvm也就是java虚拟机会把Test类加载到方法区,然后找到程序的test类的里面的main方法,作为整个程序的入口,开始运行整个程序。首先执行第三行命令people 怕= new people();执行这行代码时,内存中发生了到底哪些变化,当jvm遇到people p首先会执行jvm会到他管理路径下面找people类,如果没找到,就会报错,如果找到就会把people类加载到方法区,前面提过方法区里面主要存放一些代码和一些常量,然后栈内存中保存p引用变量,并初始化为null,加载完people类之后紧接着就执行new people(),jvm遇到new关键字到堆内存开辟一块空间,保存people类实例化的对象。并把这块内存的首地址赋值给p。具体如图所示。

这里p引用的值是new people()对象的内存空间首地址。这里需要注意的是成员变量有个初始值,所有引用类型的初始值是为null,另外一个类创建的多个对象共享成员方法。

三、结语

分析到这里,内存分析系列一就到这里了,接下来我会继续深入内存分析,关于this,super以及static,string,和继承的内存分析,希望能对大家有所帮助。

java执行程序的内存分析系列专栏的更多相关文章

  1. java执行程序的内存分析系列专栏二之static变量和方法内存分析

    昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...

  2. 【Java线程与内存分析工具】VisualVM与MAT简明教程

    目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...

  3. Java内置内存分析

    Java内存分析 package com.chao.reflection; public class Test05 { public static void main(String[] args) { ...

  4. java基础篇---内存分析

    Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变 ...

  5. JProfiler进行Java运行时内存分析

    原文地址:https://www.cnblogs.com/onmyway20xx/p/3963735.html 在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析 ...

  6. Java基础01-JVM内存分析

    JVM java虚拟机 java编译后的class文件就是在java虚拟机上运行的 1.栈区(stacksegment)存放函数的参数值,局部变量的值等,在超过这个变量的作用域时就会被系统自动释放掉存 ...

  7. Java常见对象内存分析

    首先要明确Java内存的个位置上放的是啥 类.对象.实例三者的关系: 1.类:是对象的模板,可以实例化对象.(this不能出现在静态方法中) 2.对象:类的个体. 3.实例:实现的对象. 4.对应的引 ...

  8. 【java基础】内存分析

    在上次我们说的<重载与重写>呢,我们遗留了一个问题,就是运行结果的各异性,那今天,我们就来探究一下         内存里的天地.                  首先呢,我们把mian ...

  9. [Java] 01 String 内存分析

    public class StringTest{ public static void main(String[] args){ String str1 = new String("123& ...

随机推荐

  1. jQuery 一个你意想不到的代码神器!

    jQuery 一个你意想不到的代码神器! jQuery 选择器.(最简单,最基本) jquery选择器的优势: (1) 简洁的写法,$()函数 (2)支持CSS1到CSS3选择器 (3)完善的处理机制 ...

  2. WBS任务分解中前置任务闭环回路检测:有向图的简单应用(C#)

    1 场景描述 系统中用到了进度计划编制功能,支持从project文件直接导入数据,并能够在系统中对wbs任务进行增.删.改操作.wbs任务分解中一个重要的概念就是前置任务,前置任务设置确定了不同任务项 ...

  3. Javascript性能优化之节流函数

    在我们的工作中往往有这样的需求,下拉上拉加载实现无限加载列表数据这样的一个功能,这个时候小伙伴们可能就觉得这个功能几分钟的事,于是乎,下边这段代码浩浩荡荡就出来了 window.addEventLis ...

  4. MyBatis起步

    作用:封装了JDBC操作,简化数据库访问代码.封装的功能:1.获取连接,执行SQL,释放连接2.SQL参数设置(可以直接传入对象,Mybtis会将对象的属性传入SQL语句) #{属性值}取代JDBC的 ...

  5. 企业账号打包如何通过HTML页面打开

    企业账号打包后 Plist文件加入前缀 href="itms-services://?action=download-manifest&url= Plist文件在服务器中的地址为:h ...

  6. MYBATIS 简单整理与回顾

    这两天简单整理了一下MyBatis 相关api和jar包这里提供一个下载地址,免得找了 链接:http://pan.baidu.com/s/1jIl1KaE 密码:d2yl A.简单搭建跑项目 2.进 ...

  7. 关于蓝桥杯嵌入式STM32的一点收获

    各社团成员培训时自己总结的一点材料,直接粘过来的,可能有些朋友看不明白,总之这个比赛吧:有很多技巧,掌握到技巧能省我们半个月时间,我说的是针对这个比赛,对于STM32还是要多多练习,总之STM32还是 ...

  8. OpenStack(企业私有云)万里长征第二步——使用Fuel部署

    一.前言 最近一直在使用DevStack来安装OpenStack,注意一直二字,部署了一遍又一遍,操作系统怕是安装了不下上百次,有时是为了验证新的方案,有时是安装出错,还有时是运行过程中出错.总之是碰 ...

  9. ProxySQL的相关维护说明

    背景: 前面的2篇文章MySQL ProxySQL读写分离使用初探和MySQL ProxySQL读写分离实践大致介绍了ProxySQL的使用说明,从文章的测试的例子中看到ProxySQL使用SQLIT ...

  10. Spring读取xml配置文件的原理与实现

    本篇博文的目录: 一:前言 二:spring的配置文件 三:依赖的第三方库.使用技术.代码布局 四:Document实现 五:获取Element的实现 六:解析Element元素 七:Bean创造器 ...