锁定老帖子 主题:JVM内存分析
精华帖 (6) :: 良好帖 (0) :: 新手帖 (12) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-07
最后修改:2010-07-07
全局变量包含在类对象中,因为所有的对象都在堆上生成,所以全局变量是随对象放在堆上的。
但,方法中的局部变量就不一样了,它们被放在方法栈的栈帧中(注意,如果在方法中生成对象,该对象一样在堆中创建,不过引用该对象的引用变量是放在栈帧中的) 所有的对象都是在堆上创建(Class对象除外),即使是在方法中创建的对象也是这样。 每一个线程都有自己独立的栈和程序记数器,所有线程都共享方法区和堆! 静态变量放在方法区中。每个类都有一个对应的Class对象,静态变量放在它所属的类的Class对象中。Class对象放在方法区中。也就是说,静态变量也被放在方法区了。 如果静态变量是一个引用变量,它引用某个对象,那么这个对象仍然生成在堆上,只不过这个引用变量随Class对象放在方法区。 |
|
返回顶楼 | |
发表时间:2010-07-07
好帖啊。。。我上回去面试的时候就问我内存空间怎么分配的。。
|
|
返回顶楼 | |
发表时间:2010-07-07
希望高人给我答案,根据JVM的SPEC,每个线程有一个堆栈,线程之间共享堆。而堆保存的是数组类型或者对象类型。
那么对于基础类型的共享变量比如volatile除了本线程的一份外,主存的部分到底是分配在哪里呢?是否存在共享堆栈呢 |
|
返回顶楼 | |
发表时间:2010-07-07
最后修改:2010-07-07
引用 希望高人给我答案,根据JVM的SPEC,每个线程有一个堆栈,线程之间共享堆。而堆保存的是数组类型或者对象类型。 那么对于基础类型的共享变量比如volatile除了本线程的一份外,主存的部分到底是分配在哪里呢?是否存在共享堆栈呢 堆栈是分开的,每个线程在执行方法的时候都有创建一个该方法的栈空间,里面保存的就是当前线程能访问到的数据。堆里面保存的数据才是所有线程都能访问的数据,它是通过new关键字来创建的。同样对于类里面的变量它也是在new该类的时候在堆里面给它分配了空间的,所以它是所有线程都可以访问的。而volatile关键字是指线程在访问该变量的时候会把线程上的变量值跟主内存上的变量值同步,这样多个线程访问和修改该变量值时相当于是一个值,不过在高并发的情况下还是会出现并发的错误。 |
|
返回顶楼 | |