关于java内存分析的探讨

这些天一直都想找个机会把Java内存方面的知识整理整理,毕竟任何知识都涉及到这方面。Java内存分析是java学习的一大重点。

下面我们进入正式话题讨论:

我们知道Java内存大致分为三块:如下图

我们先大致了解下java各分区的数据存放内容:

栈区:主要为方法服务,存在许许多多的方法栈帧,在方法栈帧里开辟局部变量开辟空间,基本类型按基本数据类型数据大小开辟空间,而引用类型则开辟四个字节大小。

堆区:主要存放创建的对象数据。

方法区:主要存放加载的类,静态变量,静态初始化块,常量,以及程序运行的代码。

下面我们来分析一段程序,一遍帮助我们更好学习java内存:

首先jvm从主方法进入 先加载Mydog类到方法区然后将Animal类加载到方法区,并为静态变量myAnimal在方法区开辟空间并默认初始化。

然后在堆区创建Dog类型对象:1首先为父类属性开辟空间并默认初始化,然后调用父类构造方法进行初始化。

             2再为子类新增属性开辟空间再调用子类构造方法

             3再为子类继承父类的方法和子类新增方法开辟空间。至此Dog类型对象创建完毕。

然后将myAnimal引用指向新创建出来的Dog类型对象(也称之为向上转型)。

之后myAnimal引用调用子类Dog继承父类的方法setWeight()。

最后调用子类Dog继承父类的方法getWeight(),并将其打印出来。

Ps:这里值得注意的是向上转型后即myAnimal=new Dog();

1.         myAnimal引用访问不了父类私有属性(和方法)。

2.         myAnimal引用访问不了子类新增属性(和方法),可以访问继承的属性和方法。

时间: 2024-08-07 00:15:55

关于java内存分析的探讨的相关文章

学java教程之java内存分析

学编程吧学java教程之java内存分析发布了,欢迎大家通过xuebiancheng8.com来访问 java的内存模型是java中非常重要的知识,也是面试的时候重点. java虚拟机的内存模型中和我们打交道多的分为这么几个区域 堆区,栈区,方法区. 其中方法区又分为常量池,静态区和方法区. 这几部分分别是干嘛的呢,堆区是用来存放new出来的对象的,堆区是应用程序共享的区域. 栈区又叫方法栈,程序在运行的时候,代码要在方法栈中运行,运行的代码需要放在方法栈中来执行,然后寄存器一行一行加载执行.

java内存分析总结

1.自带的jconsole工具. (1)如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可. (2)如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole . (3)当分析工具弹出时(取决于正在运行的 Java 版本以及正在运行的 Java 程序数量),可能会出现一个对话框,要求输入一个进程的 URL 来连接, 也可能列出许多不同     的本地 Java 进程(有时包含 JConsole 进程本身)来连接. 参照htt

J2SE快速进阶——Java内存分析

程序的执行过程 要在Java中分析内存,我们先来了解一下程序的执行过程: 正如上图所示,大致分为3个步骤: 1.最开始,我们的程序是存在于硬盘中的,当启动运行时,程序会被加载(load)到内存中去,这里的内存可以看做我们的内存条: 2.此时,内存中除了存在刚加载的程序的代码,还存在操作系统本身的代码(好吧,此句可以当做废话→_→),操作系统会找到程序中的Main方法开始执行程序: 3.第三步就是本文的重点,系统在程序执行过程中对内存的管理.在Java中,内存大致会被分为四块--heap(栈).s

Java内存分析1 - 从两个程序说起

这次看一些关于JVM内存分析的内容. 首先来看两个程序,这里是程序一:JVMStackTest,看下代码: package com.zhyea.robin.jvm; public class JVMStackTest { private static int count = 0; private void recur() { ++count; recur(); System.out.println("recur()方法执行结束"); } public static void main(

java 内存分析之方法返回值二

package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y)

Java内存分析

前言 只看代码,我们只能了解程序执行的先后顺序,通过内存分析,我们可以了解程序执行过程中的内存分配情况.前者是在时间维度上进行分析,后者是在空间维度上进行分析.本文目的就是将具体代码与其执行过程中的内存分配情况对应起来,使大家对这块内容有个清晰的认识. 概述 根据下图,我们首先来介绍一下整个程序执行过程.主要分为三步: 双击程序文件,将程序装载到内存中: 内存中本身有操作系统的代码,会找到代码中的main方法开始执行: 执行过程中的内存管理. 补充: 程序文件本身放在硬盘上,文件扩展名可以是.e

java 内存分析之this

package Demo; /** * this 的值是当前对象的引用 * @author Aaron * */ public class Boy { private int age; public Boy(int age) { this.age = age; } public Boy work() { this.sayHi(); return this; } public void sayHi() { System.out.println("中华人民共和国"); } public s

菜鸟学Java(二十三)——Java内存分析

我们常说的Java内存主要分为四大块(寄存器不在考虑之内,我们无法用代码来操控它):stack(栈).heap(堆).data segment(数据区).code segment(代码区).它们的主要用途如下图所示: 而在上面四个当中,我们经常谈论的是右边那两个家伙--stack和heap.今天我们就来聊聊Java代码在运行的过程中,在stack和heap中到底是什么样子的吧. 我们先看下面一段代码: public static void main(String[] args) { TestRe

Java内存分析工具

内存分析工具 IDEA插件(VisualVM Launcher) 执行main函数的时候,同时启动jvisualvm,实时查看资源消耗情况.如图效果: Eclipse Memory Analyzer Open Source 原文地址:https://www.cnblogs.com/shengulong/p/11762236.html