知识大全 JVM运行时内存空间结构
Posted 知
篇首语:白日放歌须纵酒,青春作伴好还乡。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JVM运行时内存空间结构相关的知识,希望对你有一定的参考价值。
JVM运行时内存空间结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
JVM执行Java程序的过程中管理的内存空间 包括下列几个区域
程序计数器(Program CounterRegister)
· 线程私有 占用空间很小
· 线程所执行代码行号指示器
· 解释器通过计数器的值选择下一条执行的字节码指令
· 线程执行Native方法时值为空
· 没有OOM(OutOfMemory) Java虚拟机栈(Java Virtual Machine Stacks)
· 线程私有 · 储存方法栈帧(Stack Frame)
· 栈帧 储存局部变量表 操作栈 动态链接 方法出口等
· 局部变量表 编译器可知的基本类型 对象引用和returnAddress(字节码指令的地址) 在编译期间完成分配 运行时大小不变
· 存在StackOverflowError和OOM
· StackOverflowError 线程请求栈深度大于VM允许深度
· OOM 创建线程或扩展线程空间时无足够内存
StackOverflowError例子
/**
* Xss k
*
* @author Alfred Xu <>
*
*/
public class StackSOF
int recursionLength;
void recusion()
recursionLength++;
recusion();
public static void main(String[] args)
StackSOF sof = new StackSOF();
try
sof recusion();
catch (Throwable e)
System out println(sof recursionLength);
e printStackTrace();
OOM例子
/**
* Xss m
*
* @author Alfred Xu <>
*
*/
public class StackOOM
static class Tester extends Thread
@Override
public void run()
try
Thread sleep( * );
catch (InterruptedException e)
e printStackTrace();
public static void main(String[] args)
for (int i = ;; i++)
new Tester() start();
System out println(i);
本地方法栈(Native MethodStacks)
· 线程私有 类似虚拟机栈
· 服务Native方法
· 同样存在StackOverflowError和OOM
· Hotspot中将Java虚拟机栈和本地方法栈合二为一 通过 Xss设置大小 JDK 以前默认 K 默认 M
Java堆(Java Heap)
· 所有线程共享
· 储存对象实例
· GC和OOM的主要区域
Heap OOM例子
/**
* Xms m Xmx m
*
* @author Alfred Xu <>
*
*/
public class HeapOOM
public static void main(String[] args)
List<Long> list = new ArrayList<Long>();
for (long i = ;; i++)
list add(i);
System out println(i);
方法区(Method Area)
· 又叫非堆(Non Heap) 对应HotSpot的永久代(Permanent Generation)
· 所有线程共享
· 储存VM加载的类信息 常量 静态变量 JIT编译代码等
· 也有OOM 一般是由于大量使用反射生成class
· 包含运行时常量池(Rumtime ConstantPool)
常量池溢出例子
/**
* XX:MaxPermSize= m
*
* @author Alfred Xu <>
*
*/
public class ConstantPoolOOM
public static void main(String[] args)
List<String> list = new ArrayList<String>();
for (int i = ;; i++)
list add(String valueOf(i) intern());
System out println(i);
本机直接内存(Direct Memory)
· 不受VM直接管理 但也有OOM
· 和NIO中的DirectByteBuffer相关
· 默认和Java堆大小一致
例子
/**
* XX:MaxDirectMemorySize= m
*
* @author Alfred Xu <>
*
*/
@SuppressWarnings( restriction )
public class DirectMemoryOOM
static final int _ MB = * ;
static void unsafeAllocate() throws IllegalArgumentException
IllegalAccessException
Field unsafeField = Unsafe class getDeclaredFields()[ ];
unsafeField setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField get(null);
List<Long> list = new ArrayList<Long>();
for (int i = ;; i++)
long l = unsafe allocateMemory(_ MB);
list add(l);
System out println(i);
static void byteBufferAllocate(boolean direct)
List<ByteBuffer> list = new ArrayList<ByteBuffer>();
for (int i = ;; i++)
ByteBuffer bb;
if (direct)
bb = ByteBuffer allocateDirect(_ MB);
else
bb = ByteBuffer allocate(_ MB);
list add(bb);
System out println(i);
public static void main(String[] args) throws IllegalArgumentException
IllegalAccessException
byteBufferAllocate(true);
// unsafeAllocate();
Hotspot Java内存空间结构
新生代(Young Generation)
大部分的对象的内存分配和回收在这里完成
Eden
新建的对象分配在此 minor GC后被清空
Survivor
存储至少经过一次GC存活下来的对象 以增大该对象在提升至老生代前被回收的机会
From Space
在minor GC后被清空 GC后存活的对象放入老生代
To Space
Eden中在新生代GC后存活的对象放在此
老生代(Old Generation)
多次GC后存活的对象或者新生代放置不下的大对象
永生代(PermanentGeneration)
cha138/Article/program/Java/hx/201311/25843相关参考
深入了解JVM内存结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你对JVM内存结构是否熟悉
JVM内存结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ()类装载子系统 装载连接初始化
MyEclipse内存不足之JVM内存浅谈 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MyE
JVM基础:JVM内存组成及分配 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs
深入Java底层:内存屏障与JVM并发详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 内存屏
配置JVM内存分配的妙招 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
深入探索Java工作原理:JVM,内存回收及其他 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
详解JVM的内存管理机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!我们在深入Java核心系列文
JVM内存模型及垃圾收集策略解析(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一JVM内
Eclipse中进行JVM内存设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb