Java虚拟机内存管理(一)
来源:互联网 发布:医疗器械软件风险管理 编辑:程序博客网 时间:2024/05/22 02:21
1.前言
Sun公司的HotSpot虚拟机,将内存管理划分为:线程独享和线程共享的两块区域
线程共享:比如我们new创建一个对象,对象在多线程中运行肯定是共享的 ===> 堆内存
线程独享:比如当前线程执行A方法,方法里面定义的局部变量,肯定是当前线程独享的 ===> 栈内存
这里描述的两块区域,就是一次粗糙的内存管理,也就是我们经常听到的:堆内存和栈内存
2.HotSpot虚拟机的内存划分
(1)Java堆:这是JVM内存管理中最大且最重要的一个区域,它存放着所有实例对象
从对象存活周期角度来看,可以看做是 新生代 和老年代
从内存分配角度来看,又可以更加细致的分为:Eden空间、From Survivor 空间 以及 To Survivor 空间
Java堆通过 -Xms 分配最小内存, -Xmx 分配最大内存,如果 -Xms = -Xmx ,则意味着堆内存不可扩展
(2)方法区:这里存放着静态变量、常量、类加载信息、类编辑后产生的字节码等信息
方法区又称之为 永久代,JVM对方法区的内存回收不尽如人意
它通过 -Xx:PermSize 分配方法区内存,-Xx:PermMaxSize 分配最大方法区内存
(3)Java虚拟机栈:它描述了Java方法内存模型,这里存放着方法局部变量、操作数、方法出口等信息
其实每执行一个Java方法,都是一个 栈桢(Stack Frame)进栈和出栈的过程
而所谓的 栈桢,就是存放着上面所说的:局部变量、操作数和方法出口等信息,它通过 -Xss 来分配内存
(4)Native本地方法栈:HotSpot虚拟机将它与Java虚拟机栈 合二为一
如果你通过 -Xoss 来分配本地方法栈内存,其实是无效的
(5)程序计数器PCR:存储当前线程正在执行的字节码的指令,占用内存非常小,不是内存回收的重点
通过改变PCR的值,其实就是通过改变指令所在的行号,获取下一条要执行的语句
比如if分支、for循环等等,每一条指令的执行,都是靠改变PCR的值来获取
通过以上描述,应该可以猜测得出来,哪些是线程共享的内存,哪些是独享内存
(1)和 (2) 也就是 Java堆和方法区是线程共享内存区域:这是内存回收的重点区域,特别是堆内存
(3)(4)(5)则是线程独享内存区域:所谓独享,也就是这里的内存区域生命周期和当前线程相同
这片内存随着线程的产生和而产生,随着线程的消亡而消亡,所以这里的内存也不是JVM内存回收的重点
3.如何模拟每个区域的内存溢出
Java堆内存溢出:堆是存放实例对象的区域,你用一个死循环不停创建对象,就可以模拟堆内存溢出
方法区内存溢出:这里存放着类的字节码信息,用个循环不停的动态产生类,比如使用cglib来创建
Java虚拟机栈内存溢出:这个更加单,你搞个递归调用,永不退出,运行到一定程度,一定会栈溢出的
4.简单示例模拟内存溢出
这里模拟Java堆内存溢出,分配 -Xms20M -Xmx20M -Xmn10M
即最小和最大堆内存都是20M,用个循环来不停new对象,模拟内存溢出
我使用的是spring的STS开发工具,和Eclipse差不多,可以在Debug Configurations面板配置
那么运行结果,很显然会在控制台打印:java.lang.OutOfMemoryError: Java heap space
- Java虚拟机内存管理(一)
- Java虚拟机内存管理(一)
- Java虚拟机(一)内存管理子系统
- Java虚拟机内存管理(一)
- java虚拟机内存管理机制(一):JVM内存管理总结
- Java虚拟机内存管理机制(一):JVM内存管理小结
- Java虚拟机内存管理
- Java虚拟机内存管理
- Java虚拟机内存管理
- Java虚拟机内存管理
- java虚拟机内存管理
- Java虚拟机内存管理
- java虚拟机内存管理机制(一):JVM内存管理总结【分享】
- java虚拟机内存管理机制(一):JVM内存管理总结【分享】
- java虚拟机内存管理机制(一):JVM内存管理总结【分享】
- java虚拟机内存管理机制(一):JVM内存管理总结【分享】
- 走进JAVA虚拟机(二)-------Java虚拟机的内存管理
- Java虚拟机内存管理(二)
- UML类图总结
- Freemarker常用技巧-1
- app中icon的设置
- Android7.0新特性
- php内置函数number_format
- Java虚拟机内存管理(一)
- Android学习之--底部菜单FragmentTabHost使用
- 将博客搬至CSDN
- AWS更改root密码
- 不难不易的js加密
- strstr、strspn如何使用
- qt 手动设置控件的位置
- MySQL系列第二篇:MySQL可视化工具Navicat for MySQL安装配置和使用
- 大型核心系统的升级或迁移