Java 属性 在JVM中保存的地方 的问题

问题描述

遇到一个难题,来iteye问一下,一直以来有几个疑问,关于成员变量在jvm中保存的位置有一些疑问。class TestObject { public static Object objstatic = new Object(); public int i = 1; public static int j = 2; private String privateString = "private"; public static void main(String [] args) { TestObject to = new TestObject(); }}问题1:TestObject 类里面有四个属性,初始化对象时,这四个属性分别保存在内存中的哪儿?问题2:objstatic/i/j/privateString 这四个引用保存在内存中的哪儿?麻烦讲详细一点,谢谢各位了。。跪谢! 问题补充:分多,来个40分先,回答的好继续加~!

解决方案

objstatic/j 在方法区i/privateString 在堆上作用域在方法内的变量,会在当前栈上申请空间。基本变量的,保存的是变量的值,对象或者数组的话,保存的是指针,指向堆上该对象/数组的位置。所以你在方法里,new TestObject()的时候是在堆上申请一块空间的,当TestObject obj = 的时候在栈上申请一块空间,存放指向堆上内存的位置。至于static的变量的话,是在类加载时候已经申请好的了,这块区域叫做方法区。其存放的内容也和栈上的类似,基本类型存放值,引用类型存储指针。每个对象在堆上的存储结构中,会在头部有一个对象头,对象头里保存着对象锁信息,更重要的是一个指向其类定义方法区的指针。所以你使用obj.j也是可以访问到值的,虽然会在编译时有警告。
解决方案二:
public static Object objstatic = new Object(); //objstatic :方法区,new Object() :堆 public int i = 1; // 堆 public static int j = 2; // 方法区 private String privateString = "private"; // privateString:堆,"private":方法区
解决方案三:
说下个人理解,请大家多多指正。静态变量的创建,从JVM角度而言是在方法区(Method Area),对于特定的实现的话,例如Oracle HotSpot而言是在持久区(Permanent Area),方法区或持久区,也叫栈内存。 public static Object objstatic = new Object(); 基本类型的实例变量,在线程栈中。 public int i = 1; 基本类型的静态变量,应该也是在方法区 public static int j = 2; 字符串比较特殊,这种方式的话,会在常量池(属于方法区)中创建对象 private String privateString = "private";
解决方案四:
一般有两种,栈(Stack):连续的存储单元,比较宝贵,存放基本类型的数据和对象的引用堆(Heap):分撒的存储单元,存放用new产生的对象当执行Object o = new Object();o的引用放在Stack,o里的基本的数据成员也放在Stack中,其他要在Heap。我这边有本《深入java虚拟机.pdf》,不厚,言简意赅,可以很好的解决你的问题。希望能对你有帮助:http://download.csdn.net/detail/zw19861028/5628247
解决方案五:
不是回答问题,是来请教的。因为这方面经验很是贫瘠。在什么样的场景里——即需要解决什么样的问题时,会需要这方面的知识?比如,调查内存泄漏吗?
解决方案六:
objstatic这个引用应该在方法区里面,对象则应该在堆中。i这个变量应该和这个TestObject对象一起放在堆中。j应该在方法区里。privateString放在常量池里。
解决方案七:
http://blog.csdn.net/fengren01/article/details/5403398
解决方案八:
寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据静态域:存放在对象中用static定义的静态成员常量池:存放常量非RAM存储:硬盘等永久存储空间

时间: 2024-08-03 10:22:00

Java 属性 在JVM中保存的地方 的问题的相关文章

探索Java语言与JVM中的Lambda表达式

Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.(2013.01.07最后更新) Lambda表达式,这个名字由该项目的专家组选定,描述了一种新的函数式编程结构,这个即将出现在Java SE 8中的新特性正被大家急切地等待着.有时你也会听到人们使用诸如闭包,函数直接量,匿名函数,及SAM(Single Abstract Method)这样的术语.其

ios-为什么retain属性在objeC中不一定保存?

问题描述 为什么retain属性在objeC中不一定保存? 下面的代码崩溃了,但是注释没有崩溃: @property (retain) NSDate *lastCurrentDate;...@synthesize lastCurrentDate;- (void)viewWillAppear:(BOOL)animated { BOOL crash = [lastCurrentDate isEqualToDate:[NSDate date]]);}- (void)viewDidDisappear:(

输入三个同学的c语言成绩与java成绩,并将成绩保存到一个“chengji.txt”的文件中.

问题描述 输入三个同学的c语言成绩与java成绩,并将成绩保存到一个"chengji.txt"的文件中. 编写一个程序,要求从DOS控制台以提问对话的形式,输入三个同学的c语言成绩与java成绩,并将成绩保存到一个"chengji.txt"的文件中. 创建一个Student学生类,其中域变量包括name,age,javaScore和cScore: 创建一个TestChengji类,在main主方法中分别创建三个对象数组: Student []stu=new Stud

从flex中传过来的byteArray数据怎样让Java服务器转成图片保存下来

问题描述 从flex中传过来的byteArray数据怎样让Java服务器转成图片保存下来请大家帮帮忙!!谢谢了 解决方案 解决方案二:byte直接存到文件里就行啦.解决方案三:FileOutputStream解决方案四:谁能给个例子看看,有用分数给上

教你在Java的普通类中轻松获取Session以及request中保存的值

  曾经有多少人因为不知如何在业务类中获取自己在Action或页面上保存在Session中值,当然也包括我,但是本人已经学到一种办法可以解决这个问题,来分享下,希望对你有多多少少的帮助!   如何在Java的普通类中获取Session以及request对象 详细回答请见:http://www.zhangriguang.cn/blog/20121010123838.html

Java 8 的 JVM 有多快?Fork-Join 性能基准测试

Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8.本文也将讨论最新发布在 JDK 中的并发功能更新.事实上,JDK 中已经有多处java.util.concurrent 改动,但本文重点将是 Fork-Join 框架的改进.我们将讨论一点 Fork-Join,然后实现一个简单的基准测试以比较 FJ 在 Java 7 和Java 8 中的性能. 你可能对Fork/Join在意的地方 ForkJoin 是一个通常用于并行计算递归任务的框架.它最早被引入Java 7 中,从那时起

java Hibernate框架Session的保存、更新、删除和查询教程

session的save方法 使一个临时对象变为持久化对象.session的save方法完成以下操作:1.把customer对象加入到缓存中,使他变为持久化对象2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID.Customer.hbm.xml文件中id元素的子元素指定标识符生成器: <generator><id name="id" column="ID" >    <generator class="increm

详解Java的Hibernate框架中的注解与缓存_java

注解Hibernate注解是一个没有使用XML文件来定义映射的最新方法.可以在除或替换的XML映射元数据使用注解. Hibernate的注解是强大的方式来提供元数据对象和关系表的映射.所有的元数据被杵到一起的代码POJO java文件这可以帮助用户在开发过程中同时要了解表的结构和POJO. 如果打算让应用程序移植到其他EJB3规范的ORM应用程序,必须使用注解来表示映射信息,但仍然如果想要更大的灵活性,那么应该使用基于XML的映射去. 环境设置Hibernate注释 首先,必须确保使用的是JDK

详解Java的Hibernate框架中的缓存与原生SQL语句的使用_java

Hibernate缓存缓存是所有关于应用程序的性能优化和它位于应用程序和数据库之间,以避免数据库访问多次,让性能关键型应用程序有更好的表现. 缓存对Hibernate很重要,它采用了多级缓存方案下文所述: 第一级缓存: 第一级缓存是Session的缓存,是一个强制性的缓存,通过它所有的请求都必须通过. Session对象不断自身的动力的对象,提交到数据库之前. 如果发出多个更新一个对象,Hibernate试图拖延尽可能长的时间做了更新,以减少发出的更新SQL语句的数量.如果您关闭会话,所有被缓存