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的更多相关文章

  1. 深入理解java虚拟机-01 走进java

    第一章是对java的产生,历史的整体介绍 java的使用很广泛,安装jdk的时候会看到一句广告语runs in 10 billions machines.使用java的设备多达几十亿台 1.概述 优点 ...

  2. 深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  3. 深入理解java虚拟机笔记补充-JVM常见参数设置

    JVM 常见参数设置 内存设置 参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小. -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少. -Xmn:设置年轻代大小.整个堆 ...

  4. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  5. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  6. 深入理解JAVA虚拟机JVM

    深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...

  7. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  8. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  9. 什么是HotSpot VM & 深入理解Java虚拟机 JVM

    参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...

随机推荐

  1. 套接字之sendmsg系统调用

    sendmsg系统调用允许在用户空间构造消息头和控制信息,用此函数可以发送多个数据缓冲区的数据,并支持控制信息:当调用进入内核后,会将用户端的user_msghdr对应拷贝到内核的msghdr中,然后 ...

  2. 2018092609-2 选题 Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8680 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名:胜 ...

  3. js style.display = "" 和style.display="none" 区别

    style.display = "":是清除display样式,display将使用默认值(块元素会变成block,内联元素会变成inline)style.display=&quo ...

  4. Python学习笔记:关于脚本文件中的 if __name__ = '__main__'

    这两天自己写了一个Python脚本文件,但是直接运行这个.py之后发现里面的函数并没有执行,参考别人的代码之后,发现原来要加入以下代码: if name == 'main': 函数名1 函数名2 .. ...

  5. sqlToolbox 1.82 Beta版 下载

    下载链接:https://pan.baidu.com/s/1jCTRe0NGgEb5qF3BDN_jTQ 久违的回忆. 2019年8月30日13点43分

  6. Git检出和提交至远程仓库

    步骤一:首先需要一个Github账号,还没有的话先去注册:https://github.com/,我们使用Git需要先安装Git工具,这里给出下载地址:https://git-for-windows. ...

  7. gcc编译器创建和使用静态库、动态库

    http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef ...

  8. mysql 8.0.12 安装配置方法图文教程

    一.安装 1.从网上下载MySQL8.0.12版本,下载地址 2. 下载完成后解压 我解压的路径是:D:\Java\mysql-8.0.12-winx64 3. 配置文件 首先在解压的路径下查看是否含 ...

  9. Spring 中如何自动创建代理(spring中的三种自动代理创建器)

    Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...

  10. vue-cli本地环境API代理设置和解决跨域

    前言 我们在使用vue-cli启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以localhost:8080来请求接口数据的,localhost是没有办法设置cooki ...