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,请各位前辈多多指教!文章若有侵权,麻烦马上联系我哦
来源:https://yq.aliyun.com/articles/697225
1.概念: 一个java程序从编译到执行,大概经历过4个步骤,编译成字节码,用类的加载器进行加载,分配内存,引擎执行,而内存的如何分配,是我们平时对程序进行调优的主要对象。 2.有几个区域: 大体来说分为2个,线程共享和线程独享,线程共享又分为方法区和...
Java 运行时的内存分配 程序计数器(Program Counter Register) Java虚拟机栈(VM Stack) 本地方法栈(Native Method Stack) Java堆(Heap) 方法区(Method Area) 运行时常量池(Runtime Constant Pool) 不同于C和C++的自主分配内存,java是采用虚拟机的自动内存管理。 运行时的数据区可以分成五种:...
检查java程序运行时间可以使用System.currentTimeMillis();来计算 这个System.currentTimeMillis();是得到当前系统时间,单位是毫秒ms,返回值为long 可以long begin=System.currentTimeMillis(); //中间代码 &...
参考大神笔记 以jdk1.8为例 1. Java 虚拟机规范 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。它们各有用途,有些随着虚拟机进程的启动一直存在(堆、方法区),有些则随着用户线程的启动和结束而建立和销毁(程序计数器、虚拟机栈、本地方法栈)。 《Java 虚拟机规范》中规定 Java 虚拟机管理的内存包括以下几个区域: 1.1 程序计数器 程序计...
1.1.7和1.8jvm运行时内存比较图: 1.8后的图形: 1.8和1.7相比:将原来的方法区放在直接内存中,优点就是堆中执行gc时不用去处理方法区中的常量,给gc节省时间。 2.各个模块的分析 2.1 程序计数器:实现代码的流程控制,顺序执行,异常处理。知道线程切换时该线程上次运行到哪了。唯一一个不会有OutOfMemoryError 的内存区域。生命周期随线程创建和线程结束。 ...
java运行时的数据区 java运行时,会在内存中开辟一块空间,这块空间里面有如上的几块区域。 1.程序计数器 程序计数器是一块较小的内存区域,用来存放当前线程执行字节码的行号,字节码解释器通过改变这个计数器的字来选取下一条需要执行的指令,包括分支,循环,跳转,异常处理等。所以在在每个线程中都需要一个独立的程序计数器。如果所有线程共用一个程序计数器会导致执行紊乱。 如果一个线程正在执行一个java...
面临爆炸式增长,车联网业务平台问题重重 服务于大量的客户、合作伙伴和生态链的其他企业,用户诉求来源复杂; 需求变化快,不可控因素多; 各种营销手段带来突发的业务访问; 系统越来越复杂,模块越来越多; 市场竞争剧烈,创新不断涌现; 移动互联网规模比传统互联网大10倍,物联网的规模又要再扩大10倍,新时代才刚刚开始。 行车辅助、汽车安全、智能交通、出行服务、生活娱乐等将成为车联网的主要发展方向。面临爆...
1.引入jar包,链接 2.Idea配置如下图。windows快捷键Ctrl+Alt+S,即File—Setting 3.Idea配置,快捷键 Ctrl+Shift+Alt+/ ,点击 1.Registry,勾选如下图。重启项目即可。热部署的配置在application.yml或application.properties中写配置语句。可以不写,使用默认配置...
听语音 分步阅读 百度经验:jingyan.baidu.com 一般情况下,Linux 的命令提示信息类似于以下样子,显示为[当前用户名@短主机名 当前短路径]提示符,例如 [zxb@www Desktop]$ 。 不过,有时候我们可能想自定义命令提示符的显示信息,比如显示完整的主机名和完整的路径。 那么该怎么做呢,下面就来向大家介绍。 步骤阅读 百度经验:jingyan.b...
使用Navicat Premium 12远程连接阿里云MySQL8.0 1.先登陆mysql: mysql -u root -p 2.再输入: grant all privileges on *.* to 'root'@'%' identified by 'yourPassword';#填密码 3.然后就报了这个错: ERROR 1290 (HY000): The MySQL server is ...
I am developing a site for a friend of mine. The startpage should only contain her name, a slogan and a link (something like Enter Site) to the next template. I can't figure out on how this can be acc...
Here is my use-case - I want in my web page, after user clicks a submit button to load a webpage, It will show a message box ( with a stop-loading button). I want after user click "stop loading &...
I've been trying to work around this NullPointerException issue: through researching, I found that this exception occurs when you declare a reference type but don't create an object. In my case it is ...
To get store config data, I would use this code: Now, how could I save to that node? I tried Alans suggestions from Override Magento Config, but it did not work for me. Thanks! Try following: OR...
The String I am talking about was initially a part of a JS object like: The variable I am interested in is favNumbersVal. Please notice that the starting and ending " around the value of favNumbe...