a552298242 2016-11-08 14:28 采纳率: 28.6%
浏览 792
已采纳

新人求加java中关于内存的几个问题

1、我听说栈内存用来存放一些基本类型的变量和数组及对象的引用变量,而堆内存主要是来放置对象的。那这个基本数据类型包括不包括String呢,我试了下用new String()和
用=赋值并不一样,是不是此处说的变量应该排除String呢,如果不是在栈中,是在常量池里吗,用=赋值的
2、关于类和方法加载的问题,我在一个包内写了三个类,分别是static A.class
非staticB.class,非static main.class,运行时首先回家再带有main方法的类mian,
那么在加载时,static A.class是否一开始就要在内存中加载
3、局部变量是在什么地方存储的呢,整型或布尔也是在栈中吗,String存储在常量池
里。另外就是在方法中生成的字符串是存储在哪的,比如说读取自txt文档的字符串
感觉这块好难,有几个问题都不会,请专家指点下

  • 写回答

3条回答

  • Readiay 2016-11-09 01:51
    关注

    1:String是引用类型。
    java的数据类型分为两种类型,基本类型,引用类型。基本类型就是常见的int,byte,short,long而类似于Long等是引用类型。
    基本类型与引用类型的区别呢可以简单理解为:基本类型存储在栈中的,引用类型对象存储在堆中,但是有一个东西引用他,栈中就是存储的他的地址信息,告诉代码你想用的这个对象在哪个位置,所以说是引用类型。
    2:类加载问题
    java是使用懒加载策略,就是什么时候用到,什么时候加载,如果这个类有父类,则先加载父类,如果这个类有静态变量,则先加载静态变量,然后加载静态代码块。
    3:局部变量存储在哪里
    java虚拟机对内存的划分分为:堆,栈,方法区(永久代)
    堆:就是存储java大对象的,例如String啊之类的。
    栈:每一个线程都有自己的栈区,调用一个方法的时候就会有一个栈帧与之对应。这个方法结束,栈帧也就回收了。基本类型就直接存在栈帧的局部变量表中,String这种引用类型,对象存在堆中,而栈帧的局部变量表中放的就是对这个对象的引用。所以栈相对于堆来说很小。
    方法生成的字符串自然放在堆中。

    另外:在jdk1.7及之前,还是有永久区的,1.8就换成了metasapce

    你需要一本jvm相关的书,例如深入理解java虚拟机。
    如果你的基础很差,但是有很强的上进心,对技术有很高的追求,可以淘宝买视频看,大概几块钱就可以搜到相关视频。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误