程序员Java学习笔记

JVM内存结构浅析

2017-03-18  本文已影响1568人  RunAlgorithm

1 概述

具有内存动态分配和自动回收的特点

2 运行时内存

运行时内存结构

2.1 程序计数器(Program Counter Register)

特点

字节码行号指示器,解释器通过它来选取下一条执行的字节码指令

不会有 OutOfMemoryError

2.2 Java 虚拟机栈(Java Stack)

java stack

特点

结构

整个栈以栈帧为单位

设置虚拟机栈的大小

例如:-Xss128K

有两种异常

2.3 本地方法栈(Native Method Stack)

线程私有

为本地方法执行 Native 方法服务

2.4 Java 堆(Heap)

Java 堆

特点:

因为是 GC 回收的主要区域,根据 GC 的实现机制,会对堆进行分代

堆内存分配由 -Xmn 来指定

例如:-Xms20m -Xmx20m

虚拟机会根据堆的空闲情况动态调整推大小,空余大于 70%,会减少到 -Xms,空余小于 40%,会增大到 -Xmx

所以服务器如果配置 -Xms = -Xmx,则可以避免堆自动扩展

新生代进行 minor GC,老生代进行 major GC(深度GC)。大部分GC发生在新生代中

2.5 方法区(Method Area)

特点:

存储被虚拟机加载的内容有:

方法区包含运行时常量池,Class 文件的各种字面量和符号引用,在类加载后会存入到运行时常量池中。直接引用也会存储在运行时常量池。除了类加载阶段,运行时也可以动态加入,比如 String 的 intern() 方法

方法区的大小的分配

例如:-XX:MaxPermSize=10M -XX:PermSize=10M

运行时方法区无法满足内存分配,也会抛出 OutOfMemoryError

3 直接内存

特点

JDK 1.4 的 NIO 可以直接使用 Native 函数直接分配这块内存,使用 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用

配置虚拟机参数需要考虑到这块内存,大小的分配

例如:-XX:MaxDirectMemorySize=10M

内存申请不到后也会抛出 OutOfMemoryError

上一篇 下一篇

猜你喜欢

热点阅读