文档章节

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

haoran_10
 haoran_10
发布于 2016/07/15 16:39
字数 811
阅读 13
收藏 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
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
JVM 运行时数据区简介及堆与栈的区别

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

大数据之路
2015/08/02
4.3K
1
【JVM系列】一步步解析java执行内幕

对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产...

java菜分享
2019/03/02
21
0
001. 深入JVM学习—Java运行流程

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

影狼
2018/06/22
129
0
java虚拟机笔记-1

java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行。Java程序的运行需要Java虚拟机、Java API和Java Class文件的配合。Java虚拟机实例负责运行一个Jav...

osc_5hu7tvpy
2019/10/06
2
0
经典面试题|讲一讲JVM的组成

JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成。 首先来说 JVM 的组成分为,整体组成部分和运行时...

程序猿院长
2019/04/15
56
0

没有更多内容

加载失败,请刷新页面

加载更多

Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
48分钟前
4
0
如何在Django视图中合并两个或多个查询集? - How to combine two or more querysets in a Django view?

问题: I am trying to build the search for a Django site I am building, and in that search, I am searching in 3 different models. 我正在尝试搜索要构建的Django网站,在该搜索中,我......

javail
55分钟前
5
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0
OSChina 周三乱弹 —— 公主是大王的,命是自己的。小怪也要养家糊口啊!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :郭燕的单曲《下半生》 最近听一些轻快的歌 #今日歌曲推荐# 《下半生》 - 郭燕 手机党少年们想听歌,请使劲儿戳(这里) @锦年 :...

小小编辑
今天
38
1
263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
今天
68
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部