zoukankan      html  css  js  c++  java
  • 【Java入门系列】内存分析

    Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性。

    Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

    1、栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。

    2、JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。

    3、栈属于线程私有,不能实现线程间的共享。

    4、栈的存储特性是“先进后出,后进先出”。

    5、栈是由系统自动分配的,速度快,栈是一个连续的内存空间。

    1、堆用于存储创建好的对象和数组。

    2、JVM只有一个堆,被所有线程共享。

    3、堆是一个不连续的内存空间,分配灵活,速度慢。

    方法区

    1、JVM只有一个方法区,被所有线程共享。

    2、方法区实际也是堆,只是用于存储类、常量相关的信息。

    3、用来存放程序中永远是不变或唯一的内容(类信息、静态变量、字符串常量)

     注意事项

    1、一个Java文件,只要有main入口方法,就可以认为这是一个Java程序,可以单独编译运行。

    2、无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,引用类型变量要在栈区和堆区各占一块内存。

    3、分清什么是实例什么是对象。Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。

    4、栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。

    5、以上的栈、堆、代码段、数据段等等都是相对于应用程序而言的。每一个应用程序都对应唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。

    6、类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中)。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存,方法使用完出栈。

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/ysdrzp/p/9476970.html
Copyright © 2011-2022 走看看