JVM各区域的用途
程序计数器
用于给字节码解释器来选取吓一跳需要执行的字节码指令。每个线程有一个独立的程序计数器去,且各个线程之间互不影响。如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的内存地址;如果执行的是Native方法。在计数器为Undefined。此区域是JVM规范中唯一一个不存在OOM(内存溢出)的区域。
虚拟机栈(局部变量空间)
存放编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象应用(reference)。64位的double、long占用2个槽。内存空间在编译期间就能确定,当进入一个方式时,这个方法需要分配的局部变量空间是完全确定的,通过-Xss设置内存容量。
异常状况:
- StackOverflowError栈深度大于虚拟机所允许的深。
- OOM 如果虚拟机栈可以动态扩展(当前大部分Java虚拟机都可以动态扩展,只不过Java虚拟机规范中的也允许固定长度的虚拟机栈),如果扩展是无法申请到足够的内存。
本地方法栈
跟虚拟机栈类似,只是一个是虚拟机执行Java方法,一个是执行Native方法
异常状况:
- StackOverflowError 栈深度大于虚拟机所允许的深度
- OOM(内存溢出)
Java堆
线程共享的一块内存区域,从内存回收角度来看,基本都采用分代收集算法,所以分为新生代、老年代。再细致一点可以分为Eden空间、From Survivor空间、To Survivor空间等。-Xmx-Xms控制堆空间大小。
异常状况:
- OOM(内存耗尽) 堆无法扩展时。
/**
* VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
*
* java.lang.OutOfMemoryError: Java heap space
*/
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}
方法区
线程间共享。存储已经被虚拟机加载的类信息、常量、静态变量、即时编辑器编译后的代码等数据,在HotSpot虚拟机中可以称为永生代。运行时常量也是方法区的一部分(String.intern()动态加入常量池)-XX:MaxPermSize控制大小。
异常状况:
- OOM
/**
* VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M
*
* java.lang.OutOfMemoryError:PermGen space
*/
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
// 使用List保持着常量池引用,避免Full GC回收常量池行为
List<String> list = new ArrayList<String>();
// 10MB的PermSize在integer范围内足够产生OOM了
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}
直接内存(不属于虚拟机运行时的数据区的一部分)
NIO可以使用Native函数库直接分配对外的内存,然后通过存储在Java对中的DirectByteBuffer对象作为这块内存的引用进行操作。受限于机器物理内存,可以通过-XX:MaxDirectMemorySize制定,如果不制定,默认与Java堆最大值(-Xmx)一样。
异常状况:
- OOM
public class DirectMemoryOOM {
private static final int _1MB = 1024 * 1024;
public static void main(String[] args) throws Exception {
Field unsafeField = Unsafe.class.getDeclaredFields()[0];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
}
}
JVM各区域的用途的更多相关文章
- JVM基础知识(1)-JVM内存区域与内存溢出
JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...
- JVM内存区域详解
本文分为两部分:一是JVM内存区域的讲解:二是常见的内存溢出异常分析. 1.JVM内存区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途, ...
- JVM 内存区域 (运行时数据区域)
JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...
- JVM内存区域模型
一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆” ,"perm", 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共 ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释(转)
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- 初始jvm(一)---jvm内存区域与溢出
jvm内存区域与溢出 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握. 当一个系统出现内存溢出,内存泄露的时候,因为你懂jv ...
- JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- Java虚拟机------JVM内存区域
JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...
随机推荐
- [转]angular之$apply()方法
这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...
- 深入理解http/https之缓存 2
1:web缓存的实现 web缓存: WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL, ...
- docker registry 镜像删除
registry:2.5.0版本的镜像,将镜像默认存放在了/var/lib/registry 目录下 /var/lib/registry/docker/registry/v2/repositories ...
- Angular5学习笔记 - 创建组件(四)
一.创建组件 ng generate component component-name #简写 ng g c component-name ng generate directive|pipe|ser ...
- AngularJS中的http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 自定义ASP.NET MVC Html辅助方法
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...
- sql server实用要点全解
本文介绍sql server的相关的查询语句和标准T-sql语法 写在前面 sqlsever使用注意点 可以运行 services.msc 打开服务窗口 自增列默认无法手动设置,使用 set iden ...
- 新建 FrameMaker API 时引用目录的设置
如果将FDK安装目录下的Sample项目拷贝到其它目录编译,往往会报错 c1083 找不到fapi.h等头文件,或者Link时报错找不到.lib文件. 1.可通过菜单-项目-xxx属性-配置属性-c/ ...
- delphi 从 TWebbrowse组件中获取图片
在 delphi 中使用 TWebbrowse 组件,虽然效率不如用(idhttp之类)模拟操作效率高.但其难度低,上手快,简单粗暴有效. 从网上搜到的处理此问题的文章大多是 ctrl + c 复制到 ...
- ABP缓存
简介 缓存是做什么的? 简单的可以认为是一个键值对的数据存于内存中,高速读取.作用为了减少和数据库的交互 Abp中缓存的使用 public class InvoiceAppService : Appl ...