深入理解java虚拟机(1)走进jvm
1.JDK:java程序设计语言、java虚拟机、javaAPI
二、自动内存管理机制
-----------------------------------------------------
1.运行时数据区域:
(1)java虚拟机在执行java程序的过程中会把所管理的内存划分为若干个不同的数据区域。这些区域有着各自的用途,以及创建和销毁的时间,有些区域随着虚拟机的启动而存在,有些区域则是依赖用户线程的启动和结束而创建和销毁。
(2)java虚拟机所管理的内存会包括以下几个运行时数据区域
(3)从上图可以看出堆区和方法区是被所有线程共享的。java虚拟机栈、本地方法区以及程序计数器这几个之间是线程隔离的数据区
2.程序计数器:当前线程所执行的字节码的行号指示器。字节码解释器的工作就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个计数器来完成。为了线程切换之后能够恢复到正确的位置,每个线程需要一个独立的程序计数器
3.java虚拟机栈。也是线程私有的,生命周期与线程相同。
(1)虚拟机栈描述的是java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用直至完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出站的过程。
(2)虚拟机栈一般用来存放局部变量。局部变量表所需的内存空间在编译器间完成分配,当进入一个方法的时候,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法执行期间,不会改变局部变量表的大小
(3)在java虚拟机中,对于区域规定了两种异常情况:如果请求栈深度大于虚拟机所允许的深度,就会抛出StackOverflowError异常;如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存的时候会抛出OutOfMemoryError异常
4.本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,只不过虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Ntive方法服务
5.java堆。存放数组和对象的地方。
(1)java堆是java虚拟机所管理的内存中最大的一块。java堆是 被所有线程共享的一块区域,在虚拟机启动的时候进行创建。堆内存唯一存储的是实例对象,几乎所有对象实例都在这里进行内存的分配。几乎所有对象实例都要在这里分配内存。
(2)java堆是垃圾收集器管理的主要区域,因此很多时候也称为GC堆(Garbage Collected Heap)。java堆可以细分为:新生代和老年代;如果再细致一点有Eden空间、From Survivor空间、To Survivor空间等。
(3)java虚拟机规定,java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可,就像磁盘空间一样。如果堆中没有完成内存的分配并且无法扩展的时候,就会抛出OutOfMemoryError异常
(4)java堆。heap:存放对象和数组的地方,堆分为两个区域:young generation(年轻代)+old genneration(年老代)
young generation(年轻代)又可以分为eden(伊甸区)、survivor1(幸存一区)和survivor2(幸存二区)
(5)permanent区(永久区)。相当于方法区(存放类和方法的地方)。
6.方法区(Method Area)。和堆区一样,是各个线程共享的内存区,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。还有一个别名非堆。这个区域回收的目标主要是主要是常量池的回收和类型的卸载。方法区溢出是因为类太多导致的。静态码块在类加载的时候运行,类加载的时候加载一次,后面就不再进行加载了。
7.运行时常量池。是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
8.直接内存。不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存因为被频繁使用,可能会导致OutOfMemoryError异常出现。
9.编写java源码 *.java ------(编译)----->*.class-----ClassLoader(类加载器,加载*.class文件到JVM中)
10.
深入理解java虚拟机(1)走进jvm的更多相关文章
- 深入理解java虚拟机-01 走进java
第一章是对java的产生,历史的整体介绍 java的使用很广泛,安装jdk的时候会看到一句广告语runs in 10 billions machines.使用java的设备多达几十亿台 1.概述 优点 ...
- 深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- 深入理解java虚拟机笔记补充-JVM常见参数设置
JVM 常见参数设置 内存设置 参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小. -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少. -Xmn:设置年轻代大小.整个堆 ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- 深入理解JAVA虚拟机JVM
深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- 什么是HotSpot VM & 深入理解Java虚拟机 JVM
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
随机推荐
- BruteXSS
0X01安装 我是按照下面这位大牛的博客来的 https://www.cnblogs.com/Pitcoft/p/6341322.html 0X02使用BruteXSS的使用 #在目录 BruteXS ...
- 用node批量压缩html页面
最近在写一个用了layui的后台管理系统.因为某些原因,html,css,js都写在.html里,并且没有用到别的打包工具.所以写了一个用node命令批量压缩页面并且混淆js的小工具.node安装ht ...
- 完美解决前端跨域之 easyXDM 的使用和解析
前端跨域问题在大型网站中是比较常见的问题.本文详细介绍了利用 easyXDM 解决前端跨域的原理细节和使用细节,具体使用时可以在文中代码实例的基础上扩展完成. 0.背景 因个别网络运营商存在 HTTP ...
- What is the most efficient way to deep clone an object in JavaScript?
What is the most efficient way to deep clone an object in JavaScript? Reliable cloning using a libra ...
- Android 获取视频照片与刷新媒体库
1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...
- Git - p4merge
Windows 下配置 先确保 p4merge 的路径(默认:C:\Program Files\Perforce\)在环境变量中 C:\Users\zjffu>where p4merge C:\ ...
- Link标签
Link标签的属性:rel定义当前文档与目标文档之间的关系. rev定义目标文档与当前文档之间的关系. Link和@import的区别: 1.隶属上的差别 link是一个html的一个标 ...
- 简单的servlet下载
<servlet> <servlet-name>servletTest</servlet-name> <servlet-class>com.shangs ...
- python003
一.列表 1.列表是有序的,列表的元素可以修改# list 类li=[1,22,'ss','zp',['qqqq',111,33,['eeeeeeeee'],'ddddd',True]] #通过lis ...
- magento form.html不显示 window 和 Linux下的区别
window 无大小写区别,所以可以显示表框 Linux 大小写敏感,显示不了 \app\code\community\Company\BabyPay\Model\Payment.php 里定义了fo ...