`
wu_quanyin
  • 浏览: 208190 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

JVM内存分析

    博客分类:
  • J2SE
阅读更多

一,jvm核心编程中的内存分析

 

 

 

二,对其功能大概分析

 

 

三,一个对象的调用过程

 

 

四,一个数组的调用过程

五,方法区内存

 

问题:

参照本人以前对jvm内存的了解http://wuquanyin1011.iteye.com/admin/blogs/574971

看了这些之后,仍旧对内存有很多不懂的地方,我的理解,当一个主线程启动,创建了一个属于自己的栈内存,之后继续运行有创建局部变量(局部变量的值存放在操作数栈当中)与创建对象(对象引用在在栈中,对象存放在堆内存中(存放的是怎么)),接下来就对对象进行操作,在操作的过程,需要的信息从方法区中获得.

 

1,那还有全局变量放在哪里

2,常量放在哪里(不是应该放在rom内存中吗?)

3,静态变量放在哪里(怎样识别类型变量与对象无关)

........不明白.

走过的,路过的对本人的问题有见解的,请多多指教 ....

 

 

 

 

分享到:
评论
14 楼 wupuyuan 2011-09-05  
starsea 写道
1.放在堆里
2.常量池
3.方法区里


1和2我觉得都是在堆里,LZ可以想下现在GC的模型,1个永生带2个年轻带,常量这个是放在永生带里的。无论是全局变量还是方法中生成的变量都是在年轻带,对于一个类来说,可能是全局变量,对于调用这个类的对象来说,还是个临时的。所以全局局部都是相对的。

3.静态的东西我觉得都是在方法区,毕竟加载的类都放在方法区。
欢迎LZ去我空间拍砖,wupuyuan.itieye.com
13 楼 niveko 2010-07-07  
引用

希望高人给我答案,根据JVM的SPEC,每个线程有一个堆栈,线程之间共享堆。而堆保存的是数组类型或者对象类型。
那么对于基础类型的共享变量比如volatile除了本线程的一份外,主存的部分到底是分配在哪里呢?是否存在共享堆栈呢


堆栈是分开的,每个线程在执行方法的时候都有创建一个该方法的栈空间,里面保存的就是当前线程能访问到的数据。堆里面保存的数据才是所有线程都能访问的数据,它是通过new关键字来创建的。同样对于类里面的变量它也是在new该类的时候在堆里面给它分配了空间的,所以它是所有线程都可以访问的。而volatile关键字是指线程在访问该变量的时候会把线程上的变量值跟主内存上的变量值同步,这样多个线程访问和修改该变量值时相当于是一个值,不过在高并发的情况下还是会出现并发的错误。
12 楼 yangyi 2010-07-07  
希望高人给我答案,根据JVM的SPEC,每个线程有一个堆栈,线程之间共享堆。而堆保存的是数组类型或者对象类型。
那么对于基础类型的共享变量比如volatile除了本线程的一份外,主存的部分到底是分配在哪里呢?是否存在共享堆栈呢
11 楼 xcc258 2010-07-07  
好帖啊。。。我上回去面试的时候就问我内存空间怎么分配的。。
10 楼 asst2003 2010-07-07  
全局变量包含在类对象中,因为所有的对象都在堆上生成,所以全局变量是随对象放在堆上的。
但,方法中的局部变量就不一样了,它们被放在方法栈的栈帧中(注意,如果在方法中生成对象,该对象一样在堆中创建,不过引用该对象的引用变量是放在栈帧中的)

所有的对象都是在堆上创建(Class对象除外),即使是在方法中创建的对象也是这样。

每一个线程都有自己独立的栈和程序记数器,所有线程都共享方法区和堆!

静态变量放在方法区中。每个类都有一个对应的Class对象,静态变量放在它所属的类的Class对象中。Class对象放在方法区中。也就是说,静态变量也被放在方法区了。

如果静态变量是一个引用变量,它引用某个对象,那么这个对象仍然生成在堆上,只不过这个引用变量随Class对象放在方法区。

9 楼 hatedance 2010-07-07  
wu_quanyin 写道
joehe 写道
可惜啊,知道了又如何,就是自己开发不出来

呵呵,,,如果在技术中研究怎么都要开发怎么,那还得了。

纵然开发一个成熟的产品难,但学会其原理,做一个简单的原型却是可行的。
8 楼 wu_quanyin 2010-07-07  
joehe 写道
可惜啊,知道了又如何,就是自己开发不出来

呵呵,,,如果在技术中研究怎么都要开发怎么,那还得了。
7 楼 wu_quanyin 2010-07-07  
hatedance 写道
你说的都不是java层面的,而是c层面的。所以只看java源码是不涉及这些知识的。
lz在研究jvm的c源码么?

没有,想对jvm的大概操作有所了解。只有这样之后,才能知道何时用静态的,何时用全局的,,哪个好处更多。。
6 楼 niumd 2010-07-07  
楼主读<<深入java虚拟机>>,不理解的地方请教下,钻研精神可嘉;
5 楼 joehe 2010-07-07  
可惜啊,知道了又如何,就是自己开发不出来
4 楼 hatedance 2010-07-07  
你说的都不是java层面的,而是c层面的。所以只看java源码是不涉及这些知识的。
lz在研究jvm的c源码么?
3 楼 shuiguozheng 2010-07-07  
菜鸟飘过。。。
2 楼 flyfan 2010-07-07  
收~藏~了,有空要细看
1 楼 starsea 2010-07-07  
1.放在堆里
2.常量池
3.方法区里

相关推荐

    (二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.

    MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...

    mat(mac)---jvm内存分析工具

    总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...

    jvm内存分析工具mat安装包

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...

    jvm 内存分析文档

    【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...

    JVM 内存分析

    标题 "JVM 内存分析" 涉及到的是Java虚拟机(JVM)的...总之,JVM内存分析是Java开发中的重要课题,涉及到内存分配、垃圾回收、性能优化等多个方面,通过学习和实践,开发者可以更好地理解和解决内存相关的性能问题。

    idea插件JVM内存工具JProfiler11

    IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能调优,其中就包括JProfiler11这款强大的JVM内存分析工具。本文将详细介绍如何使用Idea中的JProfiler11插件,...

Global site tag (gtag.js) - Google Analytics