找实习,两次电面都被问到了java内存模型的问题,找了很多资料,还是不太懂,大概有这样几种。
[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里面运行了.
常量池是方法区的一部分,所以会受方法区的限制.