0 0

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

遇到一个难题,来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分先,回答的好继续加~!

问题补充:集思广益~~能帮忙的过来看看。。再加40分!

问题补充:zjphzxg 说的挺不错,可惜没有说明 i j指针的存放位置!
2013年6月21日 21:08

8个答案 按时间排序 按投票排序

1 0

采纳的答案

objstatic/j 在方法区
i/privateString 在堆上
作用域在方法内的变量,会在当前栈上申请空间。基本变量的,保存的是变量的值,对象或者数组的话,保存的是指针,指向堆上该对象/数组的位置。
所以你在方法里,new TestObject()的时候是在堆上申请一块空间的,当TestObject obj = 的时候在栈上申请一块空间,存放指向堆上内存的位置。
至于static的变量的话,是在类加载时候已经申请好的了,这块区域叫做方法区。其存放的内容也和栈上的类似,基本类型存放值,引用类型存储指针。
每个对象在堆上的存储结构中,会在头部有一个对象头,对象头里保存着对象锁信息,更重要的是一个指向其类定义方法区的指针。所以你使用obj.j也是可以访问到值的,虽然会在编译时有警告。

2013年6月22日 20:57
1 0

   public static Object objstatic = new Object(); //objstatic :方法区,new Object() :堆

   public int i = 1; // 堆

   public static int j = 2; // 方法区

   private String privateString = "private";  // privateString:堆,"private":方法区

2013年6月22日 07:50
0 0

说下个人理解,请大家多多指正。


静态变量的创建,从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";

2013年6月22日 00:51
0 0

一般有两种,
栈(Stack):连续的存储单元,比较宝贵,存放基本类型的数据和对象的引用
堆(Heap):分撒的存储单元,存放用new产生的对象
当执行Object o = new Object();o的引用放在Stack,o里的基本的数据成员也放在Stack中,其他要在Heap。
我这边有本《深入java虚拟机.pdf》,不厚,言简意赅,可以很好的解决你的问题。
希望能对你有帮助:
http://download.csdn.net/detail/zw19861028/5628247

2013年6月22日 00:25
0 0

不是回答问题,是来请教的。因为这方面经验很是贫瘠。

在什么样的场景里——即需要解决什么样的问题时,会需要这方面的知识?

比如,调查内存泄漏吗?

2013年6月21日 22:22
0 0

objstatic这个引用应该在方法区里面,对象则应该在堆中。
i这个变量应该和这个TestObject对象一起放在堆中。
j应该在方法区里。
privateString放在常量池里。

2013年6月21日 21:51
0 0
0 0

寄存器:我们在程序中无法控制

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆:存放用new产生的数据

静态域:存放在对象中用static定义的静态成员

常量池:存放常量

非RAM存储:硬盘等永久存储空间

2013年6月21日 21:27

相关推荐

    JAVA JVM原理资料

    ### JAVA JVM原理资料知识点 #### 一、语言处理器的基本结构 **语言处理器**是指能够处理某种编程语言的工具,常见的包括编译器、解释器、IDE等。 1. **编译器的基本结构**: - **词法分析器**:将源代码分割成...

    java JVM standard

    虽然描述中提到“可能有点老”,但基本的JVM原理和规范仍然对现代Java开发至关重要。 Java虚拟机的主要功能包括: 1. **字节码解析**:Java源代码经过编译器编译后生成.class文件,其中包含的是字节码。JVM负责...

    java jvm调优浅谈

    Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,...因为 Java 中没有指针的概念,程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传递对象本身。

    java虚拟机

    9. **类文件结构**:.class文件包含了类的版本、常量池、字段、方法、属性等信息,这些信息是JVM正确运行Java程序的基础。 10. **内存溢出问题**:了解如何分析和解决常见的内存溢出问题,如堆溢出、栈溢出和方法区...

    深入Java虚拟机:JVM中的Stack和Heap

    "深入Java虚拟机:JVM中的Stack和Heap" Java虚拟机(JVM)是一种运行Java字节码的虚拟机环境,它具有自己的内存管理机制。...在JVM中,静态属性保存在Stack指令内存区,动态属性保存在Heap数据内存区。

    java中多态的内存分析

    - 当`new Dog()`执行时,会在堆中创建Dog对象,并初始化其属性。 - Animal类型的引用animal被分配到栈中的局部变量表,它只保存Dog对象的引用,而不是对象的所有数据。 - 当调用`animal.sound()`时,JVM会根据animal...

    JAVA高级知识,JVM篇

    ### JAVA高级知识——JVM篇 #### 一、JVM内存模型 JVM(Java Virtual Machine,Java虚拟机)作为Java程序的运行环境,其内存管理机制是理解JVM的关键。JVM内存主要分为以下几个部分: 1. **程序计数器(Program ...

    JAVA常见中文乱码问题解决方法

    Java编程语言在处理中文字符时可能会遇到乱码问题,这主要源于Java的源代码编码、JVM处理class文件以及不同操作系统、数据库系统之间的编码不一致。本文深入剖析了Java中文问题的根源,并提供了相应的解决方案。 一...

    java JDK 1.5.0的安装和设置

    2.在“系统属性”窗口中,选择“高级”选项卡。 3.点击“环境变量”按钮。 4.在“环境变量”窗口中,新建两个变量: * 变量名:PATH * 变量值:C:\Program Files\Java\jdk1.5.0\bin * 变量名:CLASSPATH * 变量...

    java中文乱码大全

    2. Java文件的编码保存:Java源文件在保存时通常会根据操作系统的file.encoding属性保存为相应的编码格式,这可能与Java内部的UNICODE编码不一致。 3. 网络传输编码:浏览器在发送请求时,默认采用UTF-8编码格式,...

    JAVA中文乱码深度分析

    - 直接运行或部署在Web容器中,Java虚拟机(JVM)根据`file.encoding`系统属性读取.class文件,然后在内存中以Unicode表示。 - 当程序需要输出中文字符时,JVM会将Unicode转换为操作系统支持的编码(如GBK)输出到...

    JAVA 基础培训,JDK和JVM,核心类的介绍和使用

    在JAVA的基础培训中,深入理解JDK(Java Development Kit)和JVM(Java Virtual Machine)是至关重要的,尤其是关于JDK中的classloader机制。这一机制负责将Java类文件加载到JVM中,使得程序能够运行。下面我们将...

    Java编程乱码问题

    Java编程中的乱码问题可能出现在以下几个环节: 1. **源代码保存**:源代码在编辑器中以操作系统默认编码(如GBK)保存。 2. **编译**:Java源代码被JDK的javac编译器编译,此过程一般不会涉及编码转换,但源代码中...

    Java中文编码问题小结

    Java中的中文编码问题是一个复杂而常见的议题,尤其是在跨平台开发中。本文主要涵盖了Java处理中文字符编码的关键点,包括Java虚拟机(JVM)的初始配置、编译过程中的编码设置、文件读写操作、XML文件处理以及字符串...

    java中文乱码字符集解决大全.pdf

    - **编写阶段**:开发者在特定操作系统(如中文Win2K)的文本编辑器中创建源代码文件(.java),文件通常按照系统默认编码(GBK)保存。 - **编译阶段**:使用JDK中的javac编译器将.java源文件转化为.class字节码...

    java 我的位置在哪里

    在Java编程语言中,"我的位置在哪里"这个问题可能涉及到多个方面。首先,它可能是关于代码中的变量或对象在内存中的位置,或者是关于程序执行时控制流的位置,还可能是关于源代码文件在项目结构中的位置。下面我们将...

    java中文乱码问题详解.pdf

    Java中的中文乱码问题主要源于Unicode编码与操作系统或应用程序中使用的其他编码格式之间的转换不匹配...了解这些原理和解决方案,可以帮助开发者有效地处理Java程序中的中文乱码问题,确保程序在各种环境下正常运行。

    java机制介绍

    - 方法指令保存在Stack中,操作码和操作数都在Stack中,对象实例的属性值保存在Heap中。 - 静态方法可以直接执行指令代码,非静态方法需要先创建对象实例。 - 静态属性保存在Stack中,具有全局属性。 5. 字符串...

    深入剖析Java编程中的中文问题及建议最优解决方法.pdf

    当Java程序在开发环境中创建时,比如在中文Windows系统中使用文本编辑器(如记事本)编写,文件会被保存为操作系统默认的GBK编码。然后,`javac`编译器将.java源文件编译为.class字节码文件。在这个过程中,Java...

Global site tag (gtag.js) - Google Analytics