问:堆和栈有什么区别
答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的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有哪些调整参数?
答:非常多,自己去找,堆内存、栈内存的大小都可以定义,甚至是堆内存的三个部分、新生代的各个比例都能调整。
转:yiihsia
相关推荐
Java虚拟机(JVM)是Java程序运行的...通过深入学习以上知识点,你将能够熟练地解决JVM相关的各种问题,无论是内存泄漏、性能瓶颈还是其他异常情况。同时,不断实践和应用这些知识,才能真正提升你在Java开发中的能力。
这份《JVM诊断指南1.4.2》的PDF文件将为Java开发人员提供丰富的实践经验和深入的理论知识,帮助他们在遇到JVM相关问题时能迅速找到解决方案,提升应用的稳定性和效率。通过学习和掌握这些内容,开发者可以更好地理解...
首先,要了解Elasticsearch节点可能遇到的JVM相关问题。例如,节点可能会因为JVM垃圾回收(GC)问题而表现异常,比如“younggc”和“oldgc”频繁发生,或者垃圾回收时间过长。这些现象通常提示我们对Heap内存分配和...
通过研究这个代码仓库,你将能够深入理解JVM的内部运作,并具备诊断和优化JVM相关问题的能力。同时,这也会帮助你编写更高效、更稳定的Java应用。记得实践是检验理论的最好方式,动手操作并结合代码理解这些概念,会...
描述中提到了一个博文链接,尽管没有给出具体内容,但根据标题,我们可以推测该博文可能详细讨论了JVM相关技术和书籍推荐。给出的标签“源码 工具”表明博文可能还涉及到了分析JVM源代码和使用相关工具进行JVM调优的...
类加载分为隐式加载和显式加载两种方式,隐式加载是通过创建类实例时由JVM自动完成,而显式加载则是通过调用ClassLoader相关方法来完成。 接下来,我们看看Java内存分配和管理。Java虚拟机的内存主要可以分为寄存器...
《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度探讨Java虚拟机(JVM)的书籍,旨在帮助开发者解决在实际工作中遇到的JVM相关问题,提升系统的性能。这本书提供了丰富的源码实例,让读者能够深入理解JVM的工作...
《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度探讨Java虚拟机(JVM)的专著,旨在帮助开发者解决实际工作中遇到的JVM相关问题,提升系统的性能表现。通过对JVM内部机制的深入理解,我们可以更有效地调试、...
然而,在实际应用中,由于各种复杂的因素,可能会遇到JVM相关的性能瓶颈或故障。本文将通过一个关于JVM问题定位的具体案例来探讨如何有效地诊断并解决这些问题。 #### 二、案例背景 本案例涉及的是Oracle公司针对...
《实战JAVA虚拟机 JVM故障诊断与性能优化》这本书主要涵盖了Java开发者在实际工作中可能遇到的JVM相关问题,包括但不限于故障排查、性能调优、内存管理、垃圾收集机制等内容。以下将详细介绍这些知识点: 1. **Java...
此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 #### 结语 合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理...
面试中,JVM相关问题是常考内容。例如,了解类加载过程(加载、验证、准备、解析、初始化)、内存泄漏的原因和检测、垃圾回收的工作原理、线程模型及死锁问题等,这些都是衡量一个Java开发者专业水平的重要指标。 ...
总的来说,HeadAnalyzer 4.1.4是WebSphere环境下Java性能调优的重要工具,通过深入解析dump文件,它能帮助我们更好地理解和解决JVM相关的问题,提升系统的稳定性和性能。同时,配合`license`文件,可能还涉及到软件...
- `buildinfo.txt`:提供了关于构建过程的信息,如编译日期、版本号等,有助于诊断问题或确定软件的构建状态。 - `src.zip`:包含了源代码,允许开发者查看和分析SAP JVM的实现细节,便于调试和学习。 - `bin`:...
本手册旨在提供一套全面且实用的JVM问题排查方法和技术,帮助开发者快速定位并解决JVM相关的性能瓶颈或异常情况。 #### 二、基础概念 - **JVM**:Java虚拟机,运行Java程序的核心环境。 - **GC(Garbage ...
此外,熟悉《JVM Specification》和相关的开源项目(如OpenJDK)是进阶学习的宝贵资源。通过实践,如分析JavaCore和dump文件,可以增强故障排查能力,有效应对内存泄漏、性能瓶颈等常见问题。 总之,JVM不仅是Java...
在Java开发领域,JVM(Java ...综上所述,理解和掌握JVM的监控技术,能够帮助开发者有效地诊断和解决性能问题,提高Java应用的稳定性和效率。通过持续监控和优化,我们可以确保JVM在各种工作负载下都能保持最佳状态。
Java虚拟机(JVM)是...通过深入学习这些知识点,并结合实际项目经验,能够提升你在面试中的竞争力,更好地理解和解决实际工作中遇到的JVM相关问题。这份“JVM面试题.pdf”文档将是你复习和准备面试的重要参考资料。
对于开发者来说,了解JVM的内部实现有助于优化代码和解决问题。例如,理解JIT(Just-In-Time)编译器的工作原理,可以知道何时Java代码会被编译为本地机器码,从而提升运行效率。 ### 总结 Java虚拟机作为Java技术...