关闭

慢慢琢磨JVM

发表于:2010-12-01 10:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  4、JVM相关问题

  问:堆和栈有什么区别

  答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的methodVar是在运行期存放到栈中的。

  栈是跟随线程的,有线程就有栈,堆是跟随JVM的,有JVM就有堆内存。

  问:堆内存中到底存在着什么东西?

  答:对象,包括对象变量以及对象方法。

  问:类变量和实例变量有什么区别?

  答:静态变量是类变量,非静态变量是实例变量,直白的说,有static修饰的变量是静态变量,没有static修饰的变量是实例变量。静态变量存在方法区中,实例变量存在堆内存中。

  问:我听说类变量是在JVM启动时就初始化好的,和你这说的不同呀!

  答:那你是道听途说,信我的,没错。

  问:Java的方法(函数)到底是传值还是传址?

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

  问:为什么会产生OutOfMemory产生?

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

  问:我产生的对象不多呀,为什么还会产生OutOfMemory?

  答:你继承层次忒多了,Heap中 产生的对象是先产生 父类,然后才产生子类,明白不?

  问:OutOfMemory错误分几种?

  答:分两种,分别是“OutOfMemoryError:java heap size”和”OutOfMemoryError: PermGen space”,两种都是内存溢出,heap size是说申请不到新的内存了,这个很常见,检查应用或调整堆内存大小。

  “PermGen space”是因为永久存储区满了,这个也很常见,一般在热发布的环境中出现,是因为每次发布应用系统都不重启,久而久之永久存储区中的死对象太多导致新对象无法申请内存,一般重新启动一下即可。

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号