java执行程序的内存分析系列专栏
近段时间研究了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执行程序的内存分析系列专栏的更多相关文章
- java执行程序的内存分析系列专栏二之static变量和方法内存分析
昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...
- 【Java线程与内存分析工具】VisualVM与MAT简明教程
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
- Java内置内存分析
Java内存分析 package com.chao.reflection; public class Test05 { public static void main(String[] args) { ...
- java基础篇---内存分析
Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变 ...
- JProfiler进行Java运行时内存分析
原文地址:https://www.cnblogs.com/onmyway20xx/p/3963735.html 在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析 ...
- Java基础01-JVM内存分析
JVM java虚拟机 java编译后的class文件就是在java虚拟机上运行的 1.栈区(stacksegment)存放函数的参数值,局部变量的值等,在超过这个变量的作用域时就会被系统自动释放掉存 ...
- Java常见对象内存分析
首先要明确Java内存的个位置上放的是啥 类.对象.实例三者的关系: 1.类:是对象的模板,可以实例化对象.(this不能出现在静态方法中) 2.对象:类的个体. 3.实例:实现的对象. 4.对应的引 ...
- 【java基础】内存分析
在上次我们说的<重载与重写>呢,我们遗留了一个问题,就是运行结果的各异性,那今天,我们就来探究一下 内存里的天地. 首先呢,我们把mian ...
- [Java] 01 String 内存分析
public class StringTest{ public static void main(String[] args){ String str1 = new String("123& ...
随机推荐
- FileInputStream和FileOutputStream详解
一.引子 文件,作为常见的数据源.关于操作文件的字节流就是 FileInputStream & FileOutputStream.它们是Basic IO字节流中重要的实现类.二.FileInp ...
- 开源自己写的一个拖拽库,兼容到IE8+
github地址:https://github.com/qiangzi7723/draggable 目前这个库的兼容做到了兼容IE8,所以如果需要兼容IE8的朋友不妨试试.库里面写了很多的注释,对于想 ...
- 使用r.js优化静态资源
r.js主要功能:优化项目的静态资源.可以简化压缩代码,减少体积.指定模块将多个组件合并为一个文件,减少HTTP请求数量.具体使用步骤如下: 先把 r.js 文件放到项目根目录,再于项目根目录内新建一 ...
- phpmyadmin上传sql文件大小限制问题解决方案
近几天在学生做项目时,需要使用phpmyadmin把本地数据库导入到线上数据库,有许多学生遇到了因为文件过大而上传失败的问题.今天给大家整理一下使用phpmyadmin遇到因为文件过大而导致上传失败问 ...
- Oracle 只导出某个用户下的表及数据
今天某大牛问我要之前我参与的一个系统的代码及库,我捣鼓下,发给了他. 他很诧异的问:这个库有这么大么 我说 因为当时是专门新建了一个实例,用户也是系统用户,所以导出的时候是导出的整个数据库 他 ZZ ...
- UNIX文件I/O
第一次用markdown语法写博客,写出来的还比较整齐,感觉博客园对序号的支持不是很好,调了一会才有了比较满意的效果,还有有哪位知道使用markdown如何插入frame? 这边博客主要说了APUE中 ...
- [原创]MongoDB综合实例一
CentOS-6.5单机实现mongoDB分片 环境:1)CentOS 6.5系统 2)IP:本机3)MongoDB:MongoDB-linux-x86_64-2.6.1 实现:两个副本集s ...
- springboot 获取hibernate 的 SessionFactory
注入bean package cn.xiaojf; import cn.xiaojf.today.data.rdb.repository.RdbCommonRepositoryImpl; import ...
- Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件
在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...
- 如何通过JS实现简单抖动效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...