Java面向对象内存分析
title: Java面向对象内存分析
date: 2018-07-28 11:12:50
tags: JavaSE
categories:
- Java
- JavaSE
一、Java虚拟机的内存区域
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area
具体如图所示:


1.栈Stack
栈的特点:
栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法入口等)
JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)
栈属于线程私有,不能实现线程间的共享!
栈的存储特性是 “先进后出,后进先出”
栈是由系统自动分配,速度快!栈是一个连续的内存空间
2.堆Heap
堆的特点:
堆用于存储创建好的对象和数组(数组也是对象)
JVM只有一个堆,被所有线程共享
堆是一个不连续的内存空间,分配灵活,速度慢
如图:


3.方法区
方法区的特点:
JVM只有一个方法区,被所有线程共享
方法区实际也是堆,只是用与存储类、常量相关的信息!
用来存放程序中永远是不变或唯一的内容。
(类信息【Class对象】、静态常量、字符串常量等)
二、程序执行的内存变化过程
2.1 一个对象的创建分为四部
分配对象空间,并将对象成员变量初始化为0或为空
执行属性值的显示初始化
执行构造方法
返回对象的地址给相关变量
2.2 程序执行过程
1.方法区加载类的信息
类的代码信息,静待方法,静态常量被加载到方法区之中


2.调用main方法(程序执行的入口)
在栈中开辟一个栈帧,调用main方法
初始stu=null
下一步执行构造方法
开辟第二个栈帧,调用构造器,开始执行该方法
构造器根据方法区里面的模板信息开始在堆区新建一个对象。方法结束后在堆区新建对象成功


3.构造器执行结束
构造器执行结束,对象属性为初始状态
构造器方法的栈帧回收删除
stu指向新生成的stu对象


4.main方法继续执行
继续执行mian方法,为stu的属性进行赋值等, 例如使得部分属性指向字符串常量,最终方法执行结束

代码如下:
package top.dlkkill.oo;
public class Student {
public String id;
public String name;
public Student() {
System.out.println("Create a Student");
}
public static void live() { }
public void study() { }
public static void main(String[] args) {
Student stu=new Student();
stu.name="abc";
stu.id="111";
}
}
三、多态内存分析
内存图如图所示:


这里要注意:
super指向的是父类
无论是哪里的this,指向的都是新构造出来的Cat对象,比如在Aniaml里面有一个方法test();
方法中通过this.voice()调用了voice方法,如果新构造的是一个Cat对象,那么这个调用的voice方法就是调用的Cat里面重写的voice方法,而不是Animal方法!(这一点比较重要,在Servlet中,我们继承一个Servlet,并重写doGet方法就可以实现我们想要的功能就是基于这个原理,例如父类中有service()方法,方法调用了doGet,我们重写了doGet方法,这里就会调用我们重写的方法)
代码如下:
package top.dlkkill.oo;
public class AnimalTest { public static void testAnimalVoice(Animal c) {
c.voice();
if(c instanceof Cat) {
((Cat) c).catchMouse();
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a=new Cat();
Cat a2=(Cat) a;
testAnimalVoice(a);
}
}
class Animal{
String str;
public void voice() {
System.out.println("普通动物叫声");
}
}
class Cat extends Animal{
public void voice() {
System.out.println("喵喵喵");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
}
程序执行,首先便会代码信息,类的信息以及静态方法、常量等加载到方法区之中。然后第一句执行,构造了一个Cat对象,具体如图所示,然后将地址交给变量使得变量指向该Cat对象。之后及时将地址交给一个Animal变量,但本质上指向的依然是一个Cat对象而不是变成Animal对象。
Java面向对象内存分析的更多相关文章
- Java 程序内存分析
转自:http://www.iteye.com/topic/528230 java程序内存主要分为了2个部分,包括stack segment(栈内存区).heap segment(堆内存区). 在分析 ...
- 1.4(java学习笔记) 面向对象内存分析
首先介绍几个概念 栈: 1.栈是方法执行的内存模型,每调用一个方法都会创建一个栈帧. 2.jvm为每个线程创建一个栈,存放方法相关信息,栈属于线程私有不共享. 3.栈由系统自动分配,是连续的内存空 ...
- Java程序内存分析:使用mat工具分析内存占用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏
Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...
- java虚拟机内存分析
1.大致来说java虚拟机分为:堆 栈 栈在数据结构就是那个先进后出的栈.堆...这名字我一听就觉得大..毕竟我们形容东西多又没什么大多的组织的时候就是一堆一堆的....(原谅我发散性的思维,我是妹 ...
- java 堆栈内存分析详解
计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...
- Java面向对象内存图
1. java虚拟机的内存划分 2. 苹果手机类 package cn.itcast.day06.demo02; /* 定义一个类,用来模拟“手机”事物. 属性:品牌.价格.颜色 行为:打电话.发短信 ...
- Java之内存分析和String对象
原文地址:http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html 文中 s2后面的注释是错误的,应该是”创建一个对象(堆中) ...
- JAVA 对象内存分析
1.jmap -heap pid 或者 jmap -histo pid 2.jmap -dump:file=folder/dumpFileName.txt,format=b pid 3.对3的输出文件 ...
随机推荐
- ionic3 slides轮播图手动滑动后无法自动播放问题
我们都知道Ionic3为我们提供了一套丰富易用的UI组件库,然而凡事是都有不完美之处,今天我们来看一下ionic3 slides组件在实现轮播功能时候的小问题. 先开UI小姐姐给到的3张美美哒效果图 ...
- 解决配置Windows Update失败问题
大家都清楚电脑总是需要更新一些补丁,不过,很多系统用户发现更新了补丁之后,开机会出现windows update更新失败的情况,提示“配置Windows Update失败,还原更改,请勿关闭计算机”信 ...
- stm32f407以太网及USB OTG快速开发
stm32f407以太网及USB OTG快速开发 引言 想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了.如果你还不会使用,别着急下面我会一步一步的用图片 ...
- ceph的正常卸载与非正常卸载
一.ceph的正常卸载与非正常卸载 一.正常卸载(通过ceph-deploy卸载) 环境已安装ceph-deploy 1.查看ceph-deploy的帮助信息 [cephde@controller03 ...
- 使用Epplus生成Excel 图表
1. 前言 这是我最近项目刚要的需求,然后在网上找了半天的教材 但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...
- 69.js--点击事件等比例弹出层div
html:<!--弹出层导航栏--> <div class="public-nav-content"> <ul> <li><a ...
- javascript中获取字符串或数组中元素的索引
有些时候,我们需要知道一个字符串中字符的位置,或者一个数组中元素的位置,这是就需要对该变量进行迭代操作. 对于数组,有两个方法indexOf和findIndex() , 需要注意的是,findInde ...
- 蓝桥杯近三年决赛题之一(15年B组)
自己计时4小时做了试试,发现只用了2个小时多一点,第二题和第六题实在没办法,不会做,第五题用了暴力(过不了多少数据),其他三题在网上看了看 应该都是对的,下面放上试题及答案. 1. 标题:积分之迷 小 ...
- 福州大学软件工程1916|W班 第2次作业成绩排名
作业链接: 结对第一次-原型设计(文献摘要热词统计) 评分准则: 本次作业评分分为两部分,一部分是博客分数(满分25分),另一部分是工程能力分数(满分30分). 博客分数评分标准: 1.在随笔开头请加 ...
- SQL kaggle learn with as excercise
rides_per_year_query = """ SELECT EXTRACT(YEAR FROM trip_start_timestamp) AS year ,CO ...