精华内容
下载资源
问答
  • 然后涉及到多线程的问题时,又存在一个主存和线程运行内存的概念,我理解主存就是说的堆,线程运行内存就是分配给线程的栈;那如果在线程的run方法里new一个对象,它是放哪呢? 如果放堆里那不是成了共享变量了?...
  • JVM,new出来的对象是在哪个区?

    千次阅读 2019-04-28 10:22:58
    new创建对象对象保存在堆还是栈? –>堆内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在堆内存 –>栈内存是用来存放在函数中定义一些基本类型变量和对象的引用变量 例子:局部变量存放...

    new创建对象,对象保存在堆还是栈?

    –>堆内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在堆内存

    –>栈内存是用来存放在函数中定义的一些基本类型的变量和对象的引用变量

    例子:局部变量存放在栈;new函数和malloc函数申请的内存在堆;函数调用参数,函数返回值,函数返回地址存放在栈

    堆和栈的区别

    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事分配方式倒是类似于链表 ,呵呵。

    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就 走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自 由度小。
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

    展开全文
  • 答:不会,设置为 null 只是中指向引用为 null,但是 new 出来的对象还是存在里面,按照目前 GC 算法,要等 survior1 or survior2 满时候 JVM 才会调用 GC 命令清除对应 survior 区的对象,将没有...

    转载自《码农每日一题》
    问:Java 对象使用后设置为 null 会减少内存占用吗?

    答:不会,设置为 null 只是栈中指向的引用为 null,但是 new 出来的对象还是存在于堆里面的,按照目前的 GC 算法,要等 survior1 or survior2 满的时候 JVM 才会调用 GC 命令清除对应 survior 区的对象,将没有栈指向的对象给回收掉。所以回收内存不是实时的,要看 survior 区的大小和应用中创建对象的速度来看。

    所以,可以认为用完的变量设为 null 有助于 java 的 gc 更早的将无用的内存收回,仅此而已。举个例子,如下:

    class Test {
        ...
    }
    
    class Test2 {
        public static void main(String[] args) { 
            Test exam = new Test(); 
            ...
            exam = null;            
            ...
        } 
    }
    

    上面第一个“ = ” 将 new Test() 所创建的对象引用赋值给 exam,exam 是对象的引用而不是对象本身,exam = null 只是解除了 exam 与原对象的引用关系,而并没有释放原对象。所以,在这个时候内存并不会减少。

    这时,该对象就成为了“垃圾”占用着内存空间,需要通过垃圾收集器来回收这些空间。由于 Java 的垃圾回收机制,Java 不需要像 C 或 C++ 那样通过程序代码来显示地释放空间,所以会由 JVM 自行回收,这部分空间何时回收是不可预知的。

    如果上面代码分析还是不懂,那就看下图,引用指向的地方变了,但是已经分配给 new Object() 的内存还是存在的,只是没有了引用指向这块内存,会被系统优先GC(但是不定时)。
    在这里插入图片描述

    展开全文
  • <li>java内存有堆和栈区别,基本数据类型值和引用以及对象的引用都是存放在栈里的,而对象是存放在堆里的,栈中数据是可以共享。 <li>jvm系统中存在一个主内存,java中所有变量都储存在主内存中,对于...
  • 线程共享:、方法区 注意:因为有了TLAB技术,堆内存并不是完完全全线程共享,其eden区域中还是有一部分空间是分配给线程独享。 线程独享: 常量存储在方法区常量池 成员变量存储在的对象里面,...

    先来张图:

    Java运行

     

        线程共享:堆、方法区    注意:因为有了TLAB技术,堆内存并不是完完全全的线程共享,其eden区域中还是有一部分空间是分配给线程独享的。
        线程独享:栈

        常量存储在方法区的常量池
        成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
        局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。

        栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容
     堆中存放使用new关键字创建的对象.
     字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。

    根据几步理解一下:

    1.Java中对象的存储位置
    String aa = new String();
    new创建的对象存储在内存中;
    aa这个局部变量存储在内存中;
    2.Java中常量的存储位置
    常量存放在常量池中,而常量池在堆内存中
    3.Java中局部变量的存储位置
    局部变量存放在内存中
    4.Java中全局变量和Static常量的存储位置
    存放在全局数据区内存中
    5.java中static修饰的成员变量及参数存放位置 
    存放在代码段内存中

    TLAB了解一下:

    为了保证对象的内存分配过程中的线程安全性,HotSpot虚拟机提供了一种叫做TLAB(Thread Local Allocation Buffer:线程私有的分配缓冲区)的技术。

    在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,当需要分配内存时,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。所以,“堆是线程共享的内存区域”这句话并不完全正确,因为TLAB是堆内存的一部分,他在读取上确实是线程共享的,但是在内存分分配上,是线程独享的

    参考链接:https://www.cnblogs.com/hollischuang/p/12453988.html

    展开全文
  • 对象引用存在中,对象存在堆中。new 出来对象都在中存储。栈的存取速度较快。 所有局部变量都放在栈内存里,不管是基本类型变量还是引用类型变量,都存储在各自方法中; 但是引用类型变量所引用对象...

    1.对象存储位置

    1. 对象的引用存在栈中,对象存在堆中。new 出来的对象都在堆中存储。栈的存取速度较快。
    2. 所有局部变量都放在栈内存里,不管是基本类型变量还是引用类型变量,都存储在各自的方法栈中;
    3. 但是引用类型变量所引用的对象(包括数组,普通Java对象)则总是存储在堆内存中。
    4. 基本类型的包装器类 如 Integer 可以在堆中创建一个非基本对象,用来表示基本类型。
    5. 也可以使用 Integer i = 1, Java SE5的自动包装功能将自动的将基本类型转换为包装器类型

    2.创建新的数据类型

    1. Java中所做的全部工作就是 定义类,生产类的对象,以及发送消息给对象,对象只能由类产生。
    2.  类中有字段和方法。字段可以是基本类型也可以是某类的对象,通过引用和对象通信,如果是引用则一定要初始化该引用,使其于一个实际对象关联。
    3. 对于类内的字段叫类的成员变量,方法内的字段叫局部变量,局部变量的作用域是这个方法。
    4. 一切对变量的修改表达式都在方法中进行,而不能出现在类中,类中只能定义字段和方法。而对变量的定义在类中方法中都可以。
       class A {
              int i = 1; //定义类的字段为基本类型,并初始化为1
               // i = 2; //错误,不能在类中出现表达式
      
              B b; //字段为对象的引用,未初始化,运行时自动初始化为null
              B c = null;// 字段为对象的引用,初始化为null,即该引用c未指向任何对象
              B d = new B();//字段为对象的引用,初始化并指向B类的一个实例
              //初始化的地方,方法不仅仅是上面的2种
          }
      
          class B {
              
          }

       

    5. 变量作为类的成员时(变量作为类的字段,不在方法中)即使不初始化,编译器也会给定一个默认值,确保得到初始化。
      基本类型及其对应数组类型 默认值
      boolean false
      char  null
      byte (byte)0
      short (short)0
      int 0
      long 0L
      float 0.0f
      double 0.0d
    6. 在C语言中,char类型占一个字节,在Java中char类型占2个字节。 所以Java中char可以存汉字,而C语言中Char不能存汉字。
    7. 唯一标识(区别)一个方法的就是方法签名,即 方法名参数列表。不依据方法返回类型区分。方法中定义一个局部变量 如 int x 必须要初始化,编译器不会默认初始化为0,运行时会报错 
    8. 创建一个类只是描述了这个类的外观和行为,并没有为其分配存储空间,只有当new之后才会在堆中分配内存空间来存放数据。

    3. 局部变量与成员变量

    public class NO1 {
        public static int a = 2;//类成员变量作用域整个类
        public static int b = 3;//类成员变量作用域整个类
        public  int c = 30;//成员变量作用域整个类
    
        public static void main(String[] args) {
            NO1 no1 = new NO1();//局部变量作用域是整个main方法
            no1.f(a, b);//把ab的值传入方法。
            System.out.println(a);
            System.out.println(b);
            no1.g(no1);// 复制一份执行no1引用传递给方法
        }
    
        /*方法接收的参数其实也是方法的局部变量如 a b */
        void f(int a, int b) {
            //int a = a;
            //int b = b;
            int c = 0;//局部变量
            a = a + b;//这里的a没有this它就是方法的参数,而不是成员变量
            b = a + b + 1; // 成员变量a b 只是和成员变量重名而已,并不会改变成员方法的值
            c = a + b;
            System.out.println(c);
        }
        void g(NO1 no){ //no也是局部变量
            //NO1 no = no;
            System.out.println(no.c);//此时no指向传递进来的对象。
            no = new NO1();// 局部变量no被指向其他对象
        }
    }

     

    4.  static关键字

    •  只有new之后会为数据分配存储空间,如果只想为某一个特定域分配空间,或者某个方法分配空间,而不通过new,那就使用static关键字,static域或者方法可以不用通过对象去调用,尽管它一定定义在类中。
    public class MyDemo {
    
        public static void main(String[] args) {
            A.i++; //通过类名直接引用变量i
            A.staticMethod();//通过类名不创建对象直接调用静态方法
            //A.method();//非静态成员不能直接引用
            A st1 = new A();
            A st2 = new A();
            System.out.println(st1.i == st2.i);//true
            
        }
    
    }
    
    class A {
        static int i = 1; //static 字段
        static{
            //static 方法块
        }
        
        static void staticMethod(){
            //static 方法
        }
        
        void method(){
            //非 static 方法
        }
    }

    通过 

    System.out.println(st1.i == st2.i);//true

    看出 static字段对于每个类来说都共享一份存储空间,而非静态字段则是每个对象都有各自的存储空间

    5. 注释

    6.编码风格

    • 参考《阿里巴巴Java开发手册》

    转载于:https://www.cnblogs.com/mibloom/p/9040333.html

    展开全文
  • 内存分析(详解与代码)

    千次阅读 2019-05-27 19:04:15
    Java虚拟机的内存可以分为三个区域:和方法区(实际上是2个,方法区实际上是一种特殊的堆存在堆里面),不管是栈还是方法区,都有相应特点,存放相应东西。 堆的特点: 1、用于存储创建好...
  • 面向对象的知识有继承、多态、抽象类、接口,在学习过程中,要了解一个类初始化过程,以及变量在内存位置(在还是在栈里还是其它)。 Java中一个类定义:public class Baidu{ private final String ...
  • arr是一个引用变量,是通过指针指向new int[3](存在堆里面)对吧,那么,里面为arr分配几个指针,是3个还是1个? >>>>>>>>>>>>>>>>>>>> 补充: 疑问1****: 其实我就是想知道java中创建数组时,中分配几个...
  • 当需要创建一个对象时,只需用new写一行简单代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应代价。用堆进行存储分配比用堆栈进行存储分配需要更多时间(如果确实可以在...
  • 举例来看,(举实例来研究多线程)New了三个匿名对象,画一个堆内存演示一下。左边是,右边是里面有主函数,主函数有代码。里面开始创建对象,匿名对象一创建完就是垃圾了(没有指向),现在有三个垃圾。...
  • 一. 我们学java程序学到现在,到底是多线程...New了三个匿名对象,画一个堆内存演示一下。 左边是,右边是里面有主函数,主函数有代码。里面开始创建对象,匿名对象一创建完就是垃圾了(没有指向),现...
  • 结论:java中是值传递1、java内存模型int n = 20;...引用类型引用地址被存储在空间,新建的对象则被存储在空间。(String字面量赋值方式除外,字面量会存储在常量池)2、方法调用过程方法调用就是给形参赋...
  • 调整JVM参数提升性能

    2016-05-05 13:56:58
    JVM存在两种内存:内存和对内存,栈内存的特点是空间比较小,速度比较快,用来存放对象的引用和程序的基本类型;堆内存的特点是空间比较大,速度慢,一般对象都在生成、使用和消亡 空间由线程开辟,线程...
  • 析构函数函数体,一般是打印信息,因为对象是在中,当程序结束时也被释放了,不存在内存泄漏。。只有当对象里面还申请了空间(成员变量时链表头指针,成员函数中有add_tail这样要申请空间),才要在析...
  • 多态绑定机制

    2016-07-05 23:16:00
    当在main方法中创建对象的时候,这个时候会在方法中创建了一个临时引用,指向堆内存实体。这个临时(因为mian方法结束后这个引用就不在存在了)引用,只能指向属于它或他子类的对象。在对象实体存储...
  • 1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的中,而内存单元中只存放对象的地址。 2. 值类型存取速度快,引用类型存取速度慢。 3. 值类型表示实际数据,引用类型表示指向存储在内存中的...
  • 深拷贝和数组扁平化

    2018-11-04 16:19:00
    这两天做笔试题时候遇到了深拷贝,在js中,一些基本类型是存在栈空间里的,而引用类型如object function之类都是存在堆内存之中,只不过是他们地址是在栈内存,通过地址找到对内存空间中数据 上代码 ...
  • 内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...
  • C#学习3

    2013-12-15 14:17:55
    类型被分为值类型和引用类型两种:...对于引用类型任何对象,他所有数据成员都存放在堆里,无论他们是值类型还是引用类型。 访问修饰符 private int a // 私有成员只能从声明它内部访问,其他类不能看见
  • 答:Class可以被实例化,属于引用类型,是分配在内存的上的,Struct属于值类型,是分配在内存的栈上的. [Page] 26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写: namespace test { public ...
  • 易学C++,C++入门

    2009-12-06 14:30:11
     8.7.2 有借有还,再借不难——堆内存的回收   8.8 方法指导   8.9 习题   第9章 自己设计的箱子——枚举和结构   9.1 我的类型我做主——枚举类型   9.2 设计一个收纳箱——定义结构类型   9.3...
  • 18.C++中什么数据分配在中,New分配数据是在近堆还是中? 答:: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 : 程序运行时动态申请,new 和 malloc申请的内存就在上 (Google...
  • java 面试题 总结

    2009-09-16 08:45:34
    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    栈的区别 20.ejb分类及区别 21.你对现在软件业以及国内软件业看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.javaawt和swing组件GUI设计关键 27....
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:为什么有栈内存堆内存之分? 93 4.6.2 基本类型数组初始化 95 4.6.3 引用类型数组初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖数组元素再次指向另一个数组?这样...
  • 层,还有一个Java Smart card版本,原本在Java文件之中并没有这样定义 但是将亡画在JⅦ内部是很合理。因为 SmartCard版本具攴持java.lang*这个核心类, 比起JM所支持核心类更少,但它也有属」自凵扩充类,...
  • 大话数据结构

    2018-12-14 16:02:18
    求100个人高考成绩平均分与求全省所有考生成绩平均分在占用时间和内存存储上有非常大差异,我们自然追求高效率和低存储算法来解决问题。 2.6.1正确性 22 2.6.2可读性 23 2.6.3健壮性 23 2.6.4时间效率高...
  • 先搜索message自己变量对象中是否存在wow,如果有就访问并且立马停止搜索,如果没有则继续往上访问它,有wow,则访问并且立马停止搜索,以此类推一直搜索到全局环境上变量对象&#...
  • 新手学习C++入门资料

    2008-12-28 23:58:50
    在当时,面向对象编程还是一个比较新理念,Stroustrup博士并不是从头开始设计新语言,而是在C语言基础上进行创建。这就是C++语言。 1985年,C++开始在外面慢慢流行。经过多年发展,C++已经有了多个版本。为次...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

对象存在内存的栈里还是堆里