写这篇博客是为了自己能够再次复习一下JVM,《深入理解java虚拟机》这本书算我的是启蒙教科书了,
这次重读是要把以前模糊的、忘记的部分记录下来。
首先说清楚,内存区域不是内存模型,指的是大家常说的栈、堆、方法区(JDK8中已经改为Metaspace)
虚拟机栈:
每一条线程有一个属于自己的虚拟机栈,而在这条线程执行时,会创建一个个的栈帧,栈帧就是一个个方法,
这么一来,栈帧内部存储的内容也就简单明了了,栈帧内存储局部变量表、操作数栈、方法出口等信息。
每一个方法的开始与结束,便对应一次入栈与出栈的过程,(栈是一种后进先出的数据结构)
栈帧中最重要的应该就是局部变量表了,局部变量表内存储有8中基本类型与对象引用地址,
注意:这里不是存储对象,对象存在堆内存中!这里是仅存储引用地址
-Xss:可以设置每一个虚拟机栈的大小,如-Xss256k
无论是栈帧太大还是虚拟机栈容量太小,当内存无法分配时,都会抛出StackOverflowError的异常
比如说使用了递归方法调用而无法终止时,便会抛出上述异常
Java堆:
为最大的一块内存,所有线程共享,用于分配存放对象实例
堆又可以分为新生代和老年代;
新生代又划分为3个区域:Eden、From Survivor、To Survivor
关于上面细分出来的4个区域,都可以通过jvm启动参数进行设置:
-Xmx:堆最大大小,如-Xmx512m
-Xms:堆初始大小,-Xms256m
设置新生代与老年代的两种方法:
-Xmn:新生代大小,通常为-Xmx的1/3或1/4-XX:NewRatio:新生代与老年代的比例,-XX:NewRatio=2,代表新生代占总堆的1/3,老年代2/3
设置新生代中区域大小:
-XX:SurvivorRatio:新生代中Eden与任一Survivor的比例,-XX:SurvivorRatio=8为默认值,代表Eden占新生代的8/10
当为对象分配内存,而GC(垃圾回收)又无法清理出内存的情况下,会发生Heap Space OutOfMemory Error
使用参数-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/xxx/xxx/xxx.hprof
可以在Heap OutOfMemory 的时候产生转储快照,然后进行分析,第二个参数可以指定dump文件位置
方法区:
所有线程共享,用于存储被虚拟机加载的类信息、常量、静态变量等数据,方法区也被称为永久代
但是被称为永久代缺不代表这部分内存不会被回收
-XX:PermSize:方法区的初始值,-XX:PermSize=64m
-XX:MaxPermSize:方法区的最大值,-XX:MaxPermSize=128m
方法区主要存放Class的相关信息,当运行时加载太多的类便会发生OutOfMemoryError: PermGen space
直接内存:
还有一种内存为直接内存,不属于虚拟机运行时数据区的一部分。
比如NI/O,可以通过Native方法直接分配内存,受到本机总内存的限制
可以通过-XX:MaxDirectMemorySize来指定大小,默认与-Xmx相同
Java中申请分配内存的方法为unsafe.allocateMemort()方法,unsafe为Unsafe的一个实例
Unsafe这个类并没有对我们开放,需要反射获取实例
内存溢出时抛出OutOfMemoryError,at sun.misc.Unsafe.allocateMemory(Native Method)
上述的内容也许不够详尽,不过由于个人表达能力欠缺,也只能写这么多了;
相信每个人都有自己独特的理解,以上可以作为参考来学习
相关推荐
这些区域在Java内存模型中同样占有重要地位,但在“java实现内存动态分配”的上下文中,主要关注堆和栈的动态分配。 综上所述,Java实现内存动态分配涉及到对堆内存、栈内存的理解,以及对垃圾回收机制的掌握。通过...
1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间不足时,会抛出`java.lang.OutOfMemoryError: Java heap space`异常。为了优化内存管理,Java采用了垃圾回收机制(Garbage ...
Java程序运行时主要涉及四种内存区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8及以后版本中,方法区被元空间取代)。 1. **程序计数器**:每个线程都有一个独立的程序计数器,用于存储当前线程...
Java虚拟机内存区域的管理是Java开发中最重要的内容之一,对于Java开发者来说,了解Java虚拟机内存区域模型是非常必要的。只有了解了Java虚拟机内存区域模型,才能更好地编写高效、可靠的Java程序。 程序计数器是...
### JAVA内存分区与C/C++内存分区的深度解析 #### JAVA内存分区 在JAVA中,JVM(Java虚拟机)的内存主要分为三个区域:堆(heap)、栈(stack)和方法区(method)。每个区域都有其特定的功能和管理机制。 1. **...
Java编程语言将内存划分为两种主要区域:栈内存(Stack Memory)和堆内存(Heap Memory),这两种内存区域各自承担不同的职责,对程序的运行起到关键作用。 栈内存主要用于存储基本类型变量(如int、char)和对象的...
JVM的内存区域组成 Java把内存分两种:一种是栈内存,另一种是堆内存。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;堆内存用来存放由new创建的对象和数组以及对象的实例变量。在函数(代码...
#### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...
Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的...
本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员理解和优化Java程序至关重要。 #### 二、栈内存 栈内存主要用于存储方法的...
#### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 - 栈内存中的数据在方法执行...
Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area)。其中,堆内存是Java对象的主要存储场所,栈内存主要存储方法调用时的局部变量,而方法区则存储类的信息,如类...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
9. **Java内存模型(JMM)**:JMM规定了多线程环境下内存的访问规则,确保线程之间的可见性和一致性。了解JMM有助于避免并发编程中的数据竞争和不确定性。 10. **深拷贝与浅拷贝**:在Java中,拷贝对象时会有深拷贝...
Java对象主要存储在堆内存中,堆是由JVM管理的动态内存区域,用于存放类实例和数组。每个Java对象都包含两部分:对象头和实例数据。 1. **对象头**: - **Mark Word**:包含对象的哈希码、锁状态标志、GC分代年龄...
在Java内存模型中,堆被分为两个主要部分:青年代(Young Generation Space)和终身代(Tenured Generation Space),即“新生代”和“老年代”。 青年代是新创建的对象存放的地方,其中包括Eden区和Survivor区。...