文档章节

JVM学习(1)-JVM运行时数据区

haoran_10
 haoran_10
发布于 2016/07/15 16:39
字数 811
阅读 11
收藏 0

导言:java是基于一门虚拟机的语言,所以了解并且熟知虚拟机运行原理非常重要。

 

先整体看一张java虚拟机技术图:



 

一、堆

1、方法区,Method Area,主要存放已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。

又称为永久代。

 

比如spring 使用IOC或者AOP创建bean时,或者使用cglib,反射的形式动态生成class信息,

如果生成大量的动态类,造成堆内存不足,则会抛出OutOfMemoryError异常。

又比如tomcat把jsp编译成servlet类的时候,也会造成这种情况。

 

2、运行时的常量池:是方法区的一部分。用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。常量池有动态性,可以添加数据。比如string常量池,imtern()。其实就是享元模式的一种实现。

 

运行时常量池溢出:比如一直往常量池加入数据,就会引起OutOfMemoryError异常

 

3、java堆,java heap。是java虚拟机所管理的内存中最大的一块。是所有线程共享的一块内存区域,在虚拟机启动时创建。存放对象实例,数组。而垃圾收集器管理的主要区域也是这个区域,也被称为GC堆。

分为新生代和老年代。

当对象大量生成造成内存不足时,也会抛出异常。

 

二、栈

1、虚拟机栈,是线程私有的,与线程的生命周期相同。描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,用于存放局部变量表(基本类型、对象引用)、操作数栈动态链表、方法出口等信息。

如果一个线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常, 比如递归调用。

如果线程生成数量过多,无法申请足够多的内存时,则会抛出OutOfMemoryError异常。比如tomcat请求数量非常多时,设置最大请求数。

 

2、本地方法栈,Native Method Stack。也就是调用虚拟机使用到的Native方法服务。也会抛出以上两种异常。

 

3、程序计算器。当前线程所执行的字节码的行号指示器。

 

三、直接内存

并不是虚拟机运行时数据区的一部分。JDK1.4引入的nio,可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DiectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中提高性能,因为避免了java堆和Native堆中来复制数据。

 

 

四、小结

虚拟机内运行时数据区整体就是上面所述,所有java对象分配回收等一系列的操作都在上述数据区,我们自己也根据虚拟机规范写一个java虚拟机,也要遵循以上原则。

 

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
JVM 运行时数据区简介及堆与栈的区别

理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,...

大数据之路
2015/08/02
0
1
001. 深入JVM学习—Java运行流程

Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存到栈...

影狼
06/22
0
0
Java虚拟机运行时数据区结构

本文部分参考自《Java虚拟机规范(Java SE 7版)》的中译本和周志明的《深入理解Java虚拟机》,另加个人理解。原书对Java虚拟机运行时数据区描述只有6页,同时参考其他网络网资料,个人能力所...

foodon
2014/12/09
0
4
深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶
06/22
0
0
JVM的方法区和永久带是什么关系?

群里面有小伙伴问到这个问题,说在网上看了很多文章,但是还是没弄明白这俩是啥关系,下面我们就来详细的解释一下: 什么是方法区? 方法区(Method Area)是jvm规范里面的运行时数据区的一个...

若鱼1919
07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker多容器部署lnmp环境

环境:RHEL7.5 ip:192.168.10.102,主机名:lb02 一、创建web、数据库目录 web网站目录为:/wwwroot,属主属组:www [root@lb02 ~]# mkdir /wwwroot[root@lb02 ~]# useradd -s /sbin/nolo...

人在艹木中
13分钟前
0
0
eclipse运行springboot项目报错‘找不到或无法加载主类’

这是一个很烦躁的问题~,往往困住大家好长时间,然后各种百度。借此,咱将这个问题有可能产生的原因进行一下总结。若有不完善之处欢迎大家在下面留言指出~~ Duang!问题出现 然后开始尝试解决...

Code辉
34分钟前
0
0
springboot oauth2 跨域设置

@Overridepublic void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/security/**") .authentica......

昆虫大侠
36分钟前
0
0
08-利用思维导图梳理JavaSE-泛型

08-利用思维导图梳理JavaSE-泛型 主要内容 1.泛型的基本概念 1.1.定义 1.2.使用前提 1.3.使用泛型的好处 2.泛型的使用 2.1.泛型类定义 2.2.泛型对象定义 2.3.泛型中的构造方法 2.4.泛型方法的...

飞鱼说编程
37分钟前
0
0
Docker 部署 Spring Boot 项目指南

仅想在Docker里运行一个Spring Boot项目,捣鼓了许久。。。 本文主要适用于Windows环境下的Docker 一、运行环境 Windows 10 Maven 3.5 Docker 18.06.1-ce-win73 (19507) 二、创建Spring Boot...

AmosWang
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部