1. 方法区:由类装载子系统查找并加载类到内存时,会提取类信息、常量、静态变量放入方法区中。虽然虚拟机规范把方法区描述为堆的一个逻辑部分,但它有个别名叫Non-Heap(非堆)。在HotSpot虚拟机中,方法区也被叫做"永久代"(Permanent Generation),可用-XX:PermSize=10M -XX:MaxPermSize=10M来设置其大小(因为有限制,更容易出现内存溢出问题,所以HotSpot官方也有放弃永久代的规划了)。J9、JRockit则是使用进程可用内存的上限。
2.Java堆:堆是被所有线程共享的一块区域,在虚拟机启动时创建,所有对象的实例以及数组都在这里分配内存,JVM会根据new指令在堆中开辟一个确定类型的对象内存空间。堆也是垃圾收集器(GC)管理的主要区域,还可以细分为:新生代和老年代。可用-Xms20M -Xmx30M来设置堆的最小值(JVM启动时的值)和最大值。
3.程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。每一个线程都有一个程序计数器,当线程执行Java程序时,程序计数器的内容总是下一条将被执行的指令的地址。
4.Java虚拟机栈:与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可用-Xss10M来设置栈大小
5.本地方法栈:本地方法栈与虚拟机栈所发挥的作用非常相似,区别不过是虚拟机栈为JVM执行Java方法服务,而本地方法栈则为JVM使用到的本地方法服务。
方法区内存溢出:
/** * VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M * * @author zzm */ public class RuntimeConstantPoolOOM { public static void main(String[] args) { // 使用List保持着常量池引用,避免Full GC回收常量池行为 List<String> list = new ArrayList<String>(); // 10MB的PermSize在integer范围内足够产生OOM了 int i = 0; while (true) { list.add(String.valueOf(i++).intern()); } } }
堆内存溢出:
/** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * * @author zzm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while (true) { list.add(new OOMObject()); } } }
栈内存溢出:
/** * VM Args:-Xss2M * * @author zzm */ public class JavaVMStackOOM { private void dontStop() { while (true) { } } public void stackLeakByThread() { while (true) { Thread thread = new Thread(new Runnable() { @Override public void run() { dontStop(); } }); thread.start(); } } public static void main(String[] args) throws Throwable { JavaVMStackOOM oom = new JavaVMStackOOM(); oom.stackLeakByThread(); } }
相关推荐
### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...
虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责解析和执行字节码,同时管理内存区域。本文主要探讨虚拟机的历史、运行时数据区域以及内存区域的配置。 首先,虚拟机的历史简述,虽然这里并不需要深入,但我们...
### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 ...以上是关于Java虚拟机的一些基础知识和深入理解的内容。通过对这些知识点的学习和掌握,可以帮助开发者更好地理解和优化Java程序的性能。
它能干什么,文章从作者得角度带大家深入Java虚拟机相关内容,希望对大家有帮助。这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器。...
2. **内存区域与内存溢出处理**: - **方法区**:存储类信息、常量、静态变量等,过度加载可能导致`OutOfMemoryError`。 - **堆**:存放对象实例,分为新生代和老年代,若无法分配更多内存,也会抛出`...
**JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...
本篇文章将深入探讨Java虚拟机中的垃圾收集器(GC)及其对内存管理的影响。 1. 垃圾收集器的由来与作用 垃圾收集器的引入主要是为了解决内存管理的问题。在没有GC的情况下,程序员需要手动释放不再使用的对象,这...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
Java垃圾收集(GC)是Java编程中至关重要的一个部分,它自动管理程序的内存,以避免内存泄漏和系统...以上内容概述了Java GC的基本概念、内存管理、垃圾回收机制以及优化策略,是深入理解和优化Java程序性能的关键。
这份"Java学习笔记_内存管理.pdf"很可能是详细解析了Java如何进行内存分配、垃圾回收以及内存泄漏等相关概念。下面,我们将深入探讨Java内存管理的一些核心知识点。 1. **Java内存模型**: - **堆内存(Heap)**:...
case 1: j++; case 2: j++; case 3: j++; case 4: j++; case 5: j++; default: j++; } ``` 以上是根据给定资料整理的一些Java基础知识点,涵盖了Java语言的基础概念、环境配置以及一些编程细节。希望...
内存分配与回收是编程语言...总的来说,理解Java的内存分配与回收策略对于优化程序性能和避免内存问题至关重要。开发者应关注GC的工作原理,合理设置内存参数,并善用不同类型的引用,以实现更高效、更稳定的程序运行。
- **JVM (Java Virtual Machine)**:Java虚拟机,负责执行由JDK编译器生成的字节码(.class文件)。 ##### 在Linux下配置Java环境 - 配置文件路径:`/etc/profile` - 使用`cat /etc/profile`查看配置文件内容。 - **...
【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...
Java虚拟机(JVM)是Java程序运行的核心,它的内存结构对于理解和优化Java应用程序的性能至关重要。本笔记将深入探讨JVM内存的各个区域及其作用,帮助开发者掌握JVM内存管理的基本概念。 首先,JVM内存主要分为以下...
垃圾回收是Java虚拟机(JVM)自动进行内存管理的重要机制,它负责回收不再使用的对象所占的内存。JVM中主要采用以下几种垃圾回收算法: 1. **标记-清除算法**:这是最基础的收集算法,分为“标记”和“清除”两个阶段...
1. **程序计数器**:程序计数器是线程私有的,用于记录当前线程所执行的字节码的行号指示器,是唯一一个在Java虚拟机规范中没有规定任何`OutOfMemoryError`情况的区域。 2. **虚拟机栈**:虚拟机栈也是线程私有的,...