java虚拟机 jvm 方法区实战
和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢。字段、方法、常量池。方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息。(内存溢出后面相关文章给大家总结)
jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize为64MB.如果你项目中使用代理模式或者CGLIB的话可能在运行的时候生成大量的类,如果这样,需要设置一下永久区的大小,防止永久区内存溢出。
CGLIB会在后面专门的章节和代理模式一起讲解。(这个系列专注的是JVM的讲解)
使用下面代码:
for (int i = 0; i <10000; i++) {
CglibWapper c=new CglibWapper("cn.springok.perm"+i)
}
代码解释:会根据传入的参数动态生成一个类以及类的实例。因为对象实例化,类的字段、方法、常量池保存在方法区,因此操作会占用一定内存的。
大量的类可能导致方法区溢出,使用下面的参数运行代码:
-XX:PermSize=10M -XX:MaxPermSize=10M -XX:PrintGCDetails
参数说明:
-XX:PermSize=10M 初始永久区大小10M
-XX:MaxPermSize 方法区最大内存10M。
-XX:PrintGCDetails 打印日志详情。
执行程序部分输出如下:
compacting perm gen total 86272K, used 86136K [0x44600000, 0x49a40000, 0x64600000)
the space 86272K, 99% used [0x44600000, 0x49a1e2f8, 0x49a1e400, 0x49a40000)
系统内存溢出了,扩大-XX:MaxPermSize值,可以生成更多的类。
可以使用工具Visual VM观察方法区的具体使用情况。
需要注意一点:
jdk8中永久区被移除了,取而代之的是元数据区,可能方法区依赖jvm的内存吧。元数据区可以使用-XX:MaxMetaspaceSize制定,跟之前版本的-XX:MaxPermSize一样,分配的值越多,就可以支持更多的类。不同的是元数据区是堆外直接内存,与方法永久区不同,在不指定大小的情况下,虚拟机会耗尽所有可用的系统内存。
元数据区发生溢出,虚拟机一样抛出异常,如下:
java.lang.OutOfMemoryError Metaspace
java虚拟机 jvm 方法区实战的更多相关文章
- java虚拟机 jvm 局部变量表实战
java局部变量表是栈帧重要组中部分之一.他主要保存函数的参数以及局部的变量信息.局部变量表中的变量作用域是当前调用的函数.函数调用结束后,随着函数栈帧的销毁.局部变量表也会随之销毁,释放空间. 由于 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- 对JVM虚拟机中方法区的理解
因为jdk8的jvm已经取消了方法区,所以这边先主要介绍jdk8以下版本中方法区相关内容. 1.虚拟机规范中方法区的概念: 原文链接:http://docs.oracle.com/javase/spe ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈
最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...
- Java虚拟机JVM相关知识整理
Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...
- Java虚拟机JVM简单理解
Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...
随机推荐
- [BZOJ]4650: [Noi2016]优秀的拆分
Time Limit: 30 Sec Memory Limit: 512 MB Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串, ...
- Python入门之装饰器九步学习入门
第一步:最简单的函数,准备附加额外功能 '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfu ...
- c语言第六次作业v
(一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...
- STM32 基DMA的DAC波形发生器
DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...
- localStorage存储数组以及取数组方法
var weekArray = ['周一'.'周二'.'周三'.'周四'.'周五']; //存: localStorage.setItem('weekDay',JSON.stringify(weekA ...
- RestTemplate的异常:Not enough variables available to expand
原因:RestTemplate使用出错,我的情况是不知道这里要求用RestTemplate的使用格式,应该很多人都是这样吧?不过,看了下RestTemplate,感觉其实还是很好用的. RestTem ...
- IOI2016Day2. paint
题目链接:http://uoj.ac/problem/238 题目大意: 有一个长度为n的黑白序列,告诉你所以k个极长连续黑段长度和顺序.有一些位置的颜色已知,需要判断剩下未知的位置哪些颜色 一定是白 ...
- Linux部分常用命令整理
./ 相当于双击 [oracle@linux01 ~]$ PWD 查看绝对路径 [oracle@linux01 ~]$ cd - 返回上一次操作的目录 [oracle@linux01 ~]$ cd . ...
- C++框架_之Qt的信号和槽的详解
C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...
- IP地址段遍历
#region 搜索ftp服务器地址 /// <summary> /// 搜索ftp服务器 /// </summary> public void SearchFtpServer ...