近段时间研究了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. TCP协议总结

    TCP的特性 TCP提供一种面向连接的.可靠的字节流服务 在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP TCP使用校验和,确认和重传机制来保证可靠传输 TCP给数据分节进行排序, ...

  2. spring security 配置多个AuthenticationProvider

    前言 发现很少关于spring security的文章,基本都是入门级的,配个UserServiceDetails或者配个路由控制就完事了,而且很多还是xml配置,国内通病...so,本文里的配置都是 ...

  3. [原创]Jquery实现表格内容点击隐藏显示内容

    1.首先看效果,点击红色字体,可是查看全部文字内容 2.JS实现 思路:将Ajax获得的数据,一份截取,一份不变,放到td里面,分别用span装着. 然后通过display属性,进行切换

  4. 基于webpack2.x的vue2.x的多页面站点

    vue的多页面 依旧使用vue-cli来初始化我们的项目 然后修改主要目录结构如下: ├── build │   ├── build.js │   ├── check-versions.js │   ...

  5. Kafka学习-简介

      Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.S ...

  6. 初码-Azure系列-记一次从阿里云到Azure的迁移和部署

    有个客户在阿里云上,这次要迁移到Azure去,手工记一下流水账 原系统信息: 阿里云ECS单Web节点(8核16G,10000IOPS SSD云盘)+阿里云ECS单数据库节点(16核32G,15000 ...

  7. angular.js封装的文件上传指令

    今天把最近用到的东西整理一下,直接上代码,需要申请犀牛存储图片,文件 1.html div div img.img-thumbnail.center-block(ng-src="{{ltUp ...

  8. 基本DOS命令之 netstat 命令详解

     netstat 命令(查看端口) netstat 命令用于显示与 IP .TCP .UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况,可以使用 netstat 命令查看 ...

  9. C#打开php链接传参然后接收返回值

    php代码 一.php <?php header("Content-Type:text/html;charset=UTF-8"); $u=$_POST['zdupdate'] ...

  10. 026 hibernate操作树形结构

    树形结构:也就是目录结构,有父目录.子目录.文件等信息,而在程序中树形结构只是称为节点. 一棵树有一个根节点,而根节点也有一个或多个子节点,而一个子节点有且仅有一个父节点(当前除根节点外),而且也存在 ...