JVM相关问答

大部份内容来源网络,整理一下,留个底。java

问:堆和栈有什么区别? 
答:堆是存放对象的,可是对象内的临时变量是存在栈内存中,如例子中的methodVar是在运行期存放到栈中的。 栈是跟随线程的,有线程就有栈,堆是跟随JVM的,有JVM就有堆内存。程序员

问: 堆内存中到底存在着什么东西? 
答:对象,包括对象变量以及对象方法。安全

问:类变量和实例变量有什么区别? 
答:静态变量是类变量,非静态变量是实例变量,直白的说,有 static修饰的变量是静态变量,没有 static修饰的变量是实例变量。静态变量存在方法区中,实例变量存在堆内存中。网络

问:Java 的方法(函数 函数函数 函数)究竟是传值仍是传址? 
答:都不是,是以传值的方式传递地址,具体的说原生数据类型传递的值,引用类型传递的地址。对于原始数据类型, JVM的处理方法是从 Method Area或Heap中拷贝到 Stack,而后运行 frame中的方法,运行完毕后再把变量指拷贝回去。函数


问:为何会产生OutOfMemory? 
答:一句话:Heap 内存中没有足够的可用内存了。这句话要好好理解,不是说 Heap没有内存了,是说新申请内存的对象大于 Heap空闲内存,好比如今 Heap还空闲 1M,可是新申请的内存须要 1.1M,因而就会报 OutOfMemory了,可能之后的对象申请的内存都只要0.9M,因而就只出现一次OutOfMemory,GC也正常了,看起来像偶发事件,就是这么回事。 但若是此时 GC没有回收就会产生挂起状况,系统不响应了。工具

问 :我产生的对象很少呀 ,为何还会产生OutOfMemory? 
答:你继承层次忒多了,Heap中 产生的对象是先产生 父类,而后才产生子类,明白不?spa


问:OutOfMemory 错误分几种? 
答:分两种,分别是“OutOfMemoryError:java heap size”和”OutOfMemoryError: PermGen space”,两种都是内存溢出,heap size是说申请不到新的内存了,这个很常见,检查应用或调整堆内存大小。 “PermGen space”是由于永久存储区满了,这个也很常见,通常在热发布的环境中出现,是由于每次发布应用系统都不重启,长此以往永久存储区中的死对象太多致使新对象没法申请内存,通常从新启动一下便可。.net


问:为何会产生StackOverflowError? 
答:由于一个线程把 Stack 内存所有耗尽了,通常是递归函数形成的。 

问:一个机器上能够看多个JVM吗?JVM 之间能够互访吗? 
答:能够多个JVM,只要机器承受得了。JVM之间是不能够互访,你不能在A-JVM中访问B-JVM的Heap 内存,这是不可能的。在之前老版本的JVM中,会出现A-JVM Crack后影响到B-JVM,如今版本很是少见。 线程

问:为何Java要采用垃圾回收机制,而不采用 C/C++的显式内存管理? 
答:为了简单,内存管理不是每一个程序员都能折腾好的。 翻译

问:JVM 中到底哪些区域是共享的?哪些是私有的? 
答:Heap和 Method Area是共享的,其余都是私有的,

问:什么是JIT? 
答:JIT 是指Just In Time,有的文档把JIT 做为JVM的一个部件来介绍,有的是做为执行引 
擎的一部分来介绍,这都能理解。Java刚诞生的时候是一个解释性语言,别嘘,即便编译成了字 
节码(byte code)也是针对JVM的,它须要再次翻译成原生代码(native code)才能被机器执行,于 
是效率的担心就提出来了。Sun为了解决该问题提出了一套新的机制,好,你想编译成原生代码, 
没问题,我在JVM上提供一个工具,把字节码编译成原生码,下次你来访问的时候直接访问原生 
码就成了,因而JIT 就诞生了,就这么回事。

问:JVM 还有哪些部分是你没有提到的? 
答:JVM是一个异常复杂的东西,写一本砖头书都不为过,还有几个要说明的: 
常量池(constant pool):按照顺序存放程序中的常量,而且进行索引编号的区域。好比 int i =100,这个 100 就放在常量池中。 
安全管理器(Security Manager):提供Java运行期的安全控制,防止恶意攻击,好比指定读取文件,写入文件权限,网络访问,建立进程等等,Class Loader在 Security Manager认证经过后才能加载 class文件的。 
方法索引表(Methods table),记录的是每一个 method 的地址信息,Stack和 Heap 中的地址指针实际上是指向 Methods table地址。

问:为何不建议在程序中显式的生命System.gc()? 
答:由于显式声明是作堆内存全扫描,也就是 Full GC,是须要中止全部的活动的(Stop The World Collection),你的应用能承受这个吗?而其显示调用System.gc()只是给虚拟机一个建议,不必定会执行,由于System.gc()在一个优先级很低的线程中执行。 

问:JVM 有哪些调整参数? 
答:很是多,堆内存、栈内存的大小均可以定义,甚至是堆内存的三个部分、新生代的各个比例都能调整。

 

文章转自:http://blog.csdn.net/ol_beta/article/details/6614351

相关文章
相关标签/搜索