`
johnsonyang
  • 浏览: 2409 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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



问:为什么会产生StackOverflowError?

答:因为一个线程把Stack内存全部耗尽了,一般是递归函数造成的。



问:一个机器上可以看多个JVM吗?JVM之间可以互访吗?

答:可以多个JVM,只要机器承受得了。JVM之间是不可以互访,你不能在A-JVM中访问B-JVM的Heap内存,这是不可能的。在以前老版本的JVM中,会出现A-JVM Crack后影响到B-JVM,现在版本非常少见。



问:为什么Java要采用垃圾回收机制,而不采用C/C++的显式内存管理?

答:为了简单,内存管理不是每个程序员都能折腾好的。



问:为什么你没有详细介绍垃圾回收机制?

答:垃圾回收机制每个JVM都不同,JVM Specification只是定义了要自动释放内存,也就是说它只定义了垃圾回收的抽象方法,具体怎么实现各个厂商都不同,算法各异,这东西实在没必要深入。



问: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),你的应用能承受这个吗?



问:JVM有哪些调整参数?

答:非常多,自己去找,堆内存、栈内存的大小都可以定义,甚至是堆内存的三个部分、新生代的各个比例都能调整
[color=red]
[/color]
分享到:
评论

相关推荐

    2015-09-12-Java虚拟机详解----JVM常见问题总结【面试必问】

    Java虚拟机(JVM)是Java程序...了解并掌握这些JVM常见问题,不仅有助于解决实际开发中的性能问题,还能在面试中展现出深厚的Java基础。对于Java开发者来说,深入理解JVM的工作原理和调优策略是不可或缺的专业技能。

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    深入jvm 内核-原理,诊断于优化视频教程

    本教程旨在帮助开发者深入了解JVM的工作原理及其内部机制,掌握JVM调优的方法和技术。通过学习本教程,开发者不仅能够提高自己的技术水平,还能更好地应对实际工作中遇到的问题。希望各位能够在学习过程中不断探索、...

    深入Java虚拟机 JVM pdf

    《深入Java虚拟机》是Java开发者必读的经典之作,它详细阐述了Java虚拟机(JVM)的工作原理和内部机制,对于理解Java程序的运行方式、优化代码性能以及排查问题具有极其重要的价值。这本书的第二版更是加入了更多...

    JVM调优实战(转)

    通过对JVM内存结构、垃圾回收机制和性能优化策略的详细讲解,帮助读者深入理解JVM的工作原理和优化方法。 1. JVM内存结构 JVM的内存结构可以分为堆内存(Heap)和非堆内存(Non-Heap)。堆内存用于存储类实例和数...

    圣思园张龙 深入理解jvm

    通过对“圣思园张龙 深入理解jvm”的内容进行梳理,我们了解到Java虚拟机作为Java技术体系的重要组成部分,在软件开发中扮演着极其重要的角色。掌握其内部工作原理和优化技巧对于提升Java应用程序的性能至关重要。...

    java基础之JVM

    ### Java基础之JVM ...以上概述了JVM的基本概念及其核心组成部分,了解这些内容对于深入学习Java编程语言和提升编程效率至关重要。此外,掌握JVM的工作原理还有助于开发者更好地理解和优化Java应用程序的性能问题。

    jdk,jvm源码

    了解JVM源码可以帮助我们深入理解Java程序的运行过程,优化内存使用,提升程序性能,排查故障。例如,通过阅读垃圾回收器的源码,我们可以学习如何调整参数以适应不同的应用场景;通过分析类加载机制,可以实现...

    深入理解JVM内幕:从基本结构到Java 7新特性

    Java虚拟机(JVM)是Java程序的核心组件,它...了解JVM的工作原理和特性,对于优化性能、排查问题以及编写高效Java代码至关重要。深入理解JVM,可以帮助开发者更好地应对各种运行时问题,提升应用程序的稳定性和效率。

    深入JVM内核—原理、诊断与优化视频教程

    通过对JVM的深入了解,可以帮助开发者更好地解决实际工作中遇到的问题,提高系统的稳定性和性能。 以上内容仅为概述,具体细节还需要结合实际场景进行深入学习和实践。希望本教程能够为读者提供有价值的指导和帮助...

    深入了解JVM,Java 开发的需要深读

    《深入理解Java虚拟机》是Java开发者提升技术深度的重要参考资料,尤其对于想要深入了解JVM机制的程序员来说,这本书无疑是一本宝贵的宝典。周志明的这部作品详细地阐述了JVM的工作原理,涵盖了许多关键知识点,让...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    总的来说,JVM原理、JVM调优、JVM内存模型和JAVA并发是Java程序员和系统管理员需要深入了解的知识点,因为它们直接影响到Java程序的性能和稳定性。了解这些知识点有助于开发者编写性能更优的代码,并在生产环境中对...

    深入理解JVM

    以上是《深入理解JVM》文档可能涵盖的部分内容,学习和理解这些知识点对于Java开发者提升程序性能、优化资源利用和解决运行时问题具有重要意义。通过深入探索JVM,开发者可以更好地驾驭这个强大的平台,编写出更加...

    深入了解jvm(Inside java virture machine)

    《深入了解JVM(Inside Java Virtual Machine)》这篇博文主要探讨了Java虚拟机(JVM)的内部机制,它是Java程序运行的基础。JVM是Java平台的核心组成部分,它负责执行字节码并提供类加载、内存管理、垃圾收集、性能...

    JVM入门到JVM 调优实战

    了解这些区域的用途和管理方式是进行JVM调优的基础。 【GC与三色标记】 垃圾收集(GC)是JVM管理内存的关键部分,避免内存泄漏和提高性能。三色标记算法是GC的一种,用于标记对象是否存活,分为白、灰、黑三种颜色...

    JVM

    对于开发者来说,了解JVM的内部实现有助于优化代码和解决问题。例如,理解JIT(Just-In-Time)编译器的工作原理,可以知道何时Java代码会被编译为本地机器码,从而提升运行效率。 ### 总结 Java虚拟机作为Java技术...

    JVM成神之路.rar

    "JVM成神之路.rar"这个压缩包显然提供了一条深入理解JVM的路径,通过作者精心录制的6小时视频教程和54页的配套笔记,我们可以期待全面了解JVM的体系结构以及与其相关的内存管理,特别是垃圾回收(GC)机制。...

    蚂蚁课堂-JVM快速入门2

    首先,我们来深入了解JVM参数。JVM参数是用来配置和调整JVM行为的关键工具。它们分为两种类型:启动参数(-X)和系统属性(-D)。启动参数主要涉及内存分配、垃圾收集策略等,例如-Xms和-Xmx用于设置初始堆内存和...

    JVM深入理解及调优.ppt

    深入理解JVM对于优化Java应用程序的性能至关重要。以下是对JVM各方面的详细阐述: 1. **Java发展史概述**: Java自1991年由James Gosling创立,经历了多次迭代和变革。从最初的Oak,到1995年更名为Java,再到J2SE...

Global site tag (gtag.js) - Google Analytics