Java程序运行时内存分析
Java程序运行在Java虚拟机中,JVM把他管理的内存分为三个区域:栈Stack、堆Heap、方法区Method Area
栈描述的是方法执行的内存模块,每个方法的调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量),栈属于线程私有、不能实现线程中的共享,连续空间,速度快。
堆用于存储创建好的对象和数组,JVM只有一个堆,被所有线程共享堆是一个不连续的内存空间。分配灵活,速度慢,
new执行完就放进堆。
方法区又叫静态区JVM只有一个方法区,被所有线程共享,方法区实际也是堆,只是用于存储类、常量相关的信息,
用来存放程序中永远不变或唯一的内容(类信息【class对象】、代码、静态变量、字符串常量。
package 内存分析; public class Person { int age; String name; Person(int age,String name){ this.age = age; this.name = name; } public static void main(String[] args) { int i = 20;//一 String name = "张三";//二 Person p1 = new Person(i,name);//三 Person p2 = p1;//四 Person p3 = new Person(30,"李四");//五 System.out.println("p1的个人信息:"+p1.age+","+p1.name);//六 System.out.println("p2的个人信息:"+p2.age+","+p2.name);//七 System.out.println("p3的个人信息:"+p3.age+","+p3.name);//八 } }
第一步:JVM从硬盘中读取Person.class类文件,通过类加载器把类Person转载到内存中,在方法区中存放了Person原型。
第二步:在方法区中找到main方法,在栈中创建一个main方法栈帧,并开始执行main函数
第三步: 执行代码第一行,因为i是main方法中的局部变量,所以存放在main栈帧;执行代码第二行,定义一个String引用name,指向存放在静态区中的字符串常量“张三”;第三行,new一个Person对象,并调用了构造方法Person(int,String)进行初始化,定义一个引用p1,并在p1中存放了该对象的地址。具体的执行过程如下:首先执行=右边的new Person,通过new在堆中申请了一块内存,存放新建的对象数据,包含对象属性及地址,调用构造函数会在栈中创建一个Person栈帧。一个方法的形参是这个方法中的局部变量,所以i和name存放在person栈帧中,代码执行结束后,会撤销Person方法栈帧。表达式new person的值返回一个地址值,并赋值给了p1。第五行类似于第三行。
初学Java,请各位前辈多多指教!文章若有侵权,麻烦马上联系我哦
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
goroutine and channel
[TOC] 1 goroutine package main import ( "fmt" "time" ) func spinner() { for { for _, c := range `\|/` { fmt.Printf("\r%c", c) time.Sleep(100 * time.Millisecond) } } } func fabi(n int) int { if n < 2 { return n } return fabi(n-1) + fabi(n-2) } func main() { go spinner() res := fabi(45) fmt.Println(res) } goroutine 是golang并发编程的概念。主routine就是main函数所在的routine,当主routine退出时,所有的其他routine会自动被退出。除了主routine和程序退出之外,没有其他办法能让一个routine退出。不过后续可以通过channel的方式通知routine自动退出。 2 并发的clock 并发的clock分为server和client,其中...
- 下一篇
java并发编程 | 线程详解
java并发编程 | 线程详解进程与线程进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配的最小单位,一个进程包含多个线程 线程:线程是cpu调度的最小单位,每个线程拥有各自的计数器,对战和局部变量等属性,并且能过访问共享的内存变量 线程的状态java线程的生命周期总共包括6个阶段: 初始状态:线程被创建,但是还没有调用start()方法运行状态:java中将就绪状态和运行状态统称为运行状态阻塞状态:线程阻塞,线程等待进入synchronized修饰的代码块或方法等待状态:线程进入等待状态,需要调用notify()或notifyAll()进行唤醒超时等待状态:线程进入等待状态,在指定时间后自行返回终止状态:线程执行完毕在某一时刻,线程只能处于其中的一个状态 线程初始化后,调用start()方法变为运行状态,调用wait(),join()等方法,线程由运行状态变为等待状态,调用notify()或notifyAll()等方法,线程由等待状态变成运行状态,超时等待状态就是在等待状态基础上加了时间限制,超过规定时间,自动更改为运行状态,当需要执行同步...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能