Choway Blog
Java 虚拟机(JVM)在执行 Java 程序时会把它管理的内存划分为多个不同的数据区域。这些区域各有用途,以及创建和销毁的时间。有些内存区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
程序计数器(Program Counter Register)
由于 JVM 的多线程是通过线程切换并分配处理器执行时间的方式来实现的,所以在任何一个时刻,一个处理器(多核CPU的一个内核)都只会执行一条线程,线程切换后为了确保每个线程能恢复到正确的执行位置,每个线程都需要有个独立的程序计数器。
- 线程私有;
- 唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 的区域;
JVM 栈(JVM Stacks)
Java 方法在执行时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
每个方法从调用到执行结束,对应一个栈帧在 JVM 栈中的入栈到出栈过程;
如果线程请求的栈深度大于 JVM 所允许的深度,将抛出 StackOverflowError;
如果 JVM 栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出 OutOfMemoryError;
- 线程私有;
- 在 JVM 规范会抛出 StackOverflowError、OutOfMemoryError;
栈溢出(StackOverflowError)
在 HotSpot 虚拟机中并不区分虚拟机栈和本地方法栈,栈容量使用 -Xss 参数设定;
JVM 堆(JVM Heap)
JVM 堆是被所有线程共享的内存区域,在虚拟机启动时创建;
JVM 规范:所有的对象实例以及数组都在堆上分配;
堆是垃圾回收器管理的主要区域,因此也被称为 GC 堆;
如果在堆中没有内存完成实例分配,并且堆也无法扩展,则抛出 OutOfMemoryError;
- 大专栏 Choway Blog
- 线程共享;
- 在 JVM 规范会抛出 OutOfMemoryError;
堆溢出(OutOfMemoryError,简称 OOM)
- -Xms 设定堆最小值,即初始化堆大小;
- -Xmx 设定堆最大值,当堆内存不够时,堆大小会自动扩展,直到达到堆最大值;
-Xms 和 -Xmx 设置一样可避免堆自动扩展;
方法区(Method Area)
方法区用于存储已被 JVM 加载的类信息、常量、静态变量、即使编译器编译后的代码等数据,各个线程共享;
该区域的内存回收目标主要针对常量池的回收和类型卸载;
- 线程共享;
- 在 JVM 规范中,当方法区无法满足内存分配,则抛出 OutOfMemoryError;
运行时常量池(Runtime Constant Pool)
常量池是方法区的一部分,也会抛出 OutOfMemoryError;
Class 文件除了有类的版本、字段、方法、接口等描述信息外,还有常量池用户存放编译期的各种字面量和符合引用,这些内容在类加载后进入方法区的运行时常量池中存放。
方法区、常量池溢出
-XX:PermSize 和 -XX:MaxPermSize 设定方法区大小;
直接内存(Direct Memory)
直接内存不是 JVM 运行时数据的一部分,也不是 JVM 规范中定义的内存。
在 JDK 1.4 中新加入了 NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的 IO 方式,它可以直接使用 Native 库直接分配堆外内存。
- -XX:MaxDirectMemorySize 参数指定直接内存大小;
- 如果不指定,默认与 -Xmx 值一样;
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可
Choway Blog的更多相关文章
- 日向blog开发记录
一点历史关于,Sonne Blog 2016.03.25springmvc + hibernate框架搭建.2016.04.21日向blog首页.2016.04.24分页实现.2016.04.30登录 ...
- blog (后续更新)
设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...
- tensorflow 一些好的blog链接和tensorflow gpu版本安装
pading :SAME,VALID 区别 http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...
- http://blog.csdn.net/java2000_wl/article/details/8627874
http://blog.csdn.net/java2000_wl/article/details/8627874
- [Android Pro] http://blog.csdn.net/wuyinlei/article/category/5773375
http://blog.csdn.net/wuyinlei/article/category/5773375
- android 蓝牙 http://blog.csdn.net/u012843100/article/details/52384219
http://blog.csdn.net/u012843100/article/details/52384219
- 【三】用Markdown写blog的常用操作
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5
前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...
- 使用Hexo搭建专属Blog
喜欢折腾的自己最开始在博客园有仿写几篇Blog,虽也可以自己改变风格,可是到底不是独立的一块儿地方,要知道独立的才是自己的;有属于自己独立的域名和Blog,真真是一件很爽的存在.在各种大牛的分享下在G ...
随机推荐
- Mybatis配置文件无故报错、无自动完成提示的解决方法,及自动生成主要配置项
1.引子 Mybatis配置文件显示红叉有错误,而实际检查又没有错误,这是因为开发环境不能识别这种类型的xml文件.要解决这个问题,就要让IDE开发环境能够“认识”这个文件类型,我们要让IDE环境将这 ...
- c#学习笔记05——数组&集合
数组 声明数组 .一维数组的定义: 数据类型[] 数组名=new 数据类型[大小]; eg: ]; ,,,,}; ]; .多维数组的定义 ,];//定义二维数组 ,,];//定义三维数组 多维数组可以 ...
- node 第三方库总结
app.post("/todo/add", (request, response) => { request.body //如何拿到前端ajax传来的JSON数据 }) 需要 ...
- Ubuntu下查看硬盘分区UUID的方法&所有Linux目录樹
在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了.命令1.sudo blkid 命令2.ls ...
- oauth2 Spring Security
oauth2四种授权方式小结 http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html 密码模式(resource owner pas ...
- java 中的小数点、大数、随机数处理
1.小数点处理 public class Test { public static void main(String[] args) { double i = 3.856; // 舍掉小数取整 Sys ...
- tesseract系列(4) -- tesseract训练问题总结
1. 每次训练模型删除目录下,上述重复的名字 2. 生成inttemp.pffmtable文件的时候,如果下述命令(1)不行的话,或者报错,使用命令(2) (1)mftraining -F font_ ...
- 系统学习Javaweb6----JavaScript2
感想:感觉自己还是只是学到皮毛,仍需继续努力,明天开始需要学习Android和阅读感想的书写. 学习笔记: 2.3.运算符 JavaScript运算符与java运算符基本一致. 这里我们来寻找不同点进 ...
- iOS MJRefresh的使用 (列表上拉加载更多)
pod 'MJRefresh' import MJRefresh 加载更多 let footView = MJRefreshAutoNormalFooter(refreshingBlock:{ //去 ...
- spring-mvc基于注解的配置
将配置文件修改为: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...