关于java内存模型的问题

找实习,两次电面都被问到了java内存模型的问题,找了很多资料,还是不太懂,大概有这样几种。

  1. java内存有堆和栈的区别,基本数据类型的值和引用以及对象的引用都是存放在栈里的,而对象是存放在堆里的,栈中的数据是可以共享的。
  2. jvm系统中存在一个主内存,java中所有的变量都储存在主内存中,对于所有线程都是共享的;每个线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝。
  3. 还有一篇文章提到将一个jvm实例的内存区域划分为了方法区、内存堆和内存栈
不太明白这些说法之间的异同和之间的联系,这个问题应该怎么回答?
还想知道在执行java HelloWorld这句命令的时候jvm都执行了哪些操作?

 

 

 

[quote]那是不是每个java程序独占一个jvm呢? [/quote]
每一个Java程序会独占一个JVM实例。
平时说JVM其实有三种含义:1.一个JVM规范 2.一套JVM实现(例如HotSpot、J9等)3.一个运行中的JVM实例。
[quote]常量池是在栈内存里面吗?[/quote]
不是,JVM为每一个类维护着一个常量池。
可参考:
[url]http://boy00fly.iteye.com/blog/1095263[/url]
还有问题可以再交流。

介个,不是java内存模型关注的东西吧!

首先解析.java文件,解析成.class文件,jvm加载这个class文件,在内存中通过class文件在内存堆中构造一个对象,用此对象调用class中的方法。

建议你看看JVM的相关书籍吧,看看JVM规范或者Inside JVM这本书!
[quote]还想知道在执行java HelloWorld这句命令的时候jvm都执行了哪些操作?[/quote]
这句命令执行,会生成一个JVM实例(开辟一块堆内存、开启一个Java线程、分配一个Java栈),然后进入main方法执行相关的代码逻辑。

java 内存模型中主要有:堆,方法区,本地方法区栈,虚拟机栈和程序计数器
其中堆和方法区是线程间共享.本地方法区栈,虚拟机栈和程序计数器是线程私有,生命周期为拥有线程的生命周期.

执行java HelloWorld
首先执行ClassLoader加载HelloWorld.class.这个过程包括:加载.验证,准备.解析,unloading,使用.初始化.每个过程jvm的操作都不一样.

同时启动两个Tomcat,在操作系统中的进程号都不一样,
在系统级里面已经是不同的线程了.更别说在JVM里面运行了.

常量池是方法区的一部分,所以会受方法区的限制.