美文网首页
JAVA编程基础之内存划分

JAVA编程基础之内存划分

作者: 乐学小乐 | 来源:发表于2020-11-03 09:21 被阅读0次

内存划分:

JVM内存划分:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuQVGaoy-1604027570804)(/1581994360789.png)]

栈的特点:

站描述的时方法执行的内存模型,每个方法被调用都 会创建一个栈帧()

在程序运行期,方法的内存分析:

public class MethodTest {
    public static void main(String[] args) {
        int w=5;
        int h=7;
        int area=getArea(w,h);
        System.out.println(area);
    }
    //求面积
    public static int getArea(int w,int h) {
        return w*h;
    }
}

过程1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gijm6AD5-1604027570810)(/1581996831235.png)]

1)程序要运行,当执行java命令时,把类的信息MethodTest.class加载到内存

2)虚拟机JVM调用main方法,主方法压栈运行,在栈中为main方法开辟栈帧,存储main中出现的局部变量

​ int w=5; int h=35;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFtvRi0k-1604027570819)(/1581996473209.png)]

3)main方法中调用getArea()方法,栈中为getArea方法开辟栈帧

4)方法压栈执行并为形参赋值 int w=5;int h=7; 计算结果并return 35;将结果返回方法的给调用者

5)方法getArea执行完毕,弹栈释放内存

6)继续执行main方法中内容,栈空间中存储局部变量int area = 35;getArea方法返回值赋值给area

7)main方法执行完毕,弹栈释放内存空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vs7JDEn-1604027570827)(/1581996989453.png)]

重载(Method OverLoad)

一般来说,功能点相同的方法才适合使用重载,重载必须满足如下要求:

①必须是同一个类

②方法名必须相同

③参数列表不同

public class Demo {

    //一个普通得方法,不带参数,无返回值
    public void add(){
        //method body
    }

    //重载上面的方法,并且带了一个整形参数,无返回值
    public void add(int a){
        //method body
    }

        //重载上面的方法,并且带了两个整型参数,返回值为int型
    public int add(int a,int b){
        //method body
        return 0;
    }

}

注意:方法重载与返回值无关。

参数列表不同:

​ 参数的个数不同。

​ 参数的对应的数据类型不同。

​ 参数的顺序不同(不同类型的可以交换位置)

递归结构

递归是一种常见的解决问题的方法,即把问题逐渐简单化。 递归的基本思想就是 自己调用自己 ”,一个使用递归技术的方法将会直接或者间接的调用自己。利用递归可以用简单的程序来解决一些复杂的问题。比如:大多数排序使用的就是递归算法。

递归结构包括两个部分:

  1. 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环。
  2. 递归体。解答:什么时候需要调用自身方法。
public static void print(int i) {
    System.out.println(i);
    if(i==10){ //递归头
        return; //提前结束方法
    }
    print(++i); //递归
}

public static void main(String[] args) {
    print(1);  //打印1~10之间的数据
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atnogN2B-1604027570834)(/5b6fac208b0ad.jpg)]

这个图片很好的诠释了递归,我们可以使用代码实现打印吓得我抱起了抱着抱着抱着我的小鲤鱼的我的我的我

public static void recursion(int i) {
    System.out.println("抱着");
    if (i==0) { //临界条件
        System.out.println("我的小鲤鱼");
    } else {
        recursion(--i);  // 递归调用
    }
    System.out.println("的我");
}

public static void main(String[] args) {
    System.out.println("吓得我抱起了");
    recursion(2);
}

递归的缺陷:

简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多。所以再使用时要慎重。

注意:任何可用递归解决的问题也能使用迭代解决。但递归方法可以更加自然地反映问题,并且易于理解和调试,并且不强调效率问题时,可以采用递归;

在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。

相关文章

  • JAVA编程基础之内存划分

    内存划分: JVM内存划分: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuQ...

  • java并发线程的基础

    Java并发系列之java并发编程基础

  • Java基础->JVM内存划分

    说到虚拟机的内存划分,一般会笼统地分为堆跟栈,因为这两块在开发当中接触较多。 其实应该分为:虚拟机栈、本地方法栈 ...

  • java并发编程(四)

    java多线程编程(四) 引言: 内存模型的基础----内存模型相关的基本概念 java内存模型中的顺序一致性--...

  • Java内存模型

    Java内存模型的基础 本文是《java并发编程的艺术》一书的学习笔记 1.Java内存模型的抽象结构 1.Jav...

  • java基础编程练习之谁拿了最多奖学金

    java基础编程练习之谁拿了最多奖学金

  • 好好看,好好学

    Java部分 面向对象 java 内存JVM:图文解析 Java内存结构Java虚拟机内存管理——内存空间划分Ja...

  • 深入分析 Java 内存模型与应用

    深入分析 Java 内存模型,奠定坚实的并发编程基础。欢迎扫码参与。

  • java内存模型

    java内存模型基础 并发编程,两个关键问题:线程通信和线程同步通信机制:共享内存和消息传递 java并发采用共享...

  • 深入理解 JVM 之 JVM 内存结构

    深入理解 JVM 之 JVM 内存结构 Java 虚拟机在运行 Java 程序 时,把它所管理的内存划分为若干个不...

网友评论

      本文标题:JAVA编程基础之内存划分

      本文链接:https://www.haomeiwen.com/subject/guzrvktx.html