Java虚拟机内存管理:

共享:

  方法区:存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

  java堆:存储对象实例

线程独占区:

  虚拟机栈:存放方法运行时所需的数据、成为栈帧

  本地方法栈:为jvm所调用到的Nativate即本地方法服务

  程序计数器:记录当前线程所执行到的字节码的行号

程序计数器:

较小的内存区域 当前线程所执行的字节码行号指示器  

如果是java方法 记录当前字节码指令的地址   如果是native方法 值为undefined  没有oom异常的区域

goto java中唯一的一个保留字

虚拟机栈:

  java方法执行的动态内存模型

  栈帧:

    每个方法执行,都会创建一个栈帧,伴随方法创建到执行完成。存储局部变量表、操作数栈、动态链接、方法出口等。

  局部变量表:

    存放编译器可知的各种基本数据类型,引用类型,returnAddress类型  64位的long 和double占用两个slot(局部变量空间)其余只占用一个

    局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,运行期间不会改变局部变量表的大小。

  大小:

    如果线程请求的栈深度大于虚拟机所允许的深度,将发生Stack Overflow  例如递归方法没有出口

    如果扩展时无法申请到足够的空间将发生oom

本地方法栈:

  本地方法栈为虚拟机使用到的native方法服务

  也会出现 Stack Overflow和oom

Java堆:

  存放对象实例

  jvm管理的最大的内存区域

  垃圾收集器管理的主要区域

  新生代、老年代、Eden空间

  (逃逸分析、栈上分配、标量替换)

  OOM异常

方法区:(非堆 Non-heap)

  线程共享

  存储虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据

  类版本  字段  方法  接口

  方法区和永久代

  垃圾回收在方法区的行为:针对常量池的回收和类型的卸载

  异常的定义:OOM

常量池:(运行时常量池 方法区的一部分)

  存放编译期生成的各种字面量和符号引用,将在类加载后进入方法区的运行时常量池中存放

  也会把翻译出来的直接引用存放到运行时常量池中

  运行期间也可以将新的常量放入常量池中 String类的intern方法

  OOM异常

intern方法是native方法

直接内存:(Direct Memory)

  不是jvm的一部分  

  OOM异常

  NIO (New Input/Output):引入一种基于通道与缓冲区的I/O方式 使用native函数库直接分配堆外内存,通过一个存储在java heap中的DirectByteBuffer对象作为这块内存的引用进行操作

  由DirectMemory导致的内存溢出,在heap dump文件中不会看到明显的异常

java对象的结构:

  Header(对象头)

    自身运行时数据(Mark Word):hash值  GC分代年龄  锁状态标志  线程持有的锁  偏向线程id  偏向时间戳

    类型指针:数组(还有一个记录数组长度的数据)  指向对象元数据的指针

  InstanceData:

    long、double分在一起  short。char分到一起  相同长度分一起

  Padding

    占位符  

对象创建:分配空间

  指针碰撞:Serial、ParNew等使用compact过程的收集器

  空闲列表:CMS 基于Mark-Sweep算法

对象访问定位:

  通过栈上的reference数据操作堆上的具体对象

  使用句柄:java堆中划分出句柄池 保存实例对象的地址  java栈中的引用地址不需要改变 只改变句柄池

  使用指针 hotspot采用的方式:直接指针  速度快

到对象实例的指针和到对象类型数据的指针

 

    

JVM--02的更多相关文章

  1. 02 Java类的加载机制

    1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  2. java反射(2)+Class.forName( )

    在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢? 其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映 ...

  3. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  4. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  5. 02 JVM 从入门到实战 | 什么样的对象需要被 GC

    引言 上一篇文章 JVM 基本介绍 我们了解了一些基本的 JVM 知识,本篇开始逐步学习垃圾回收,我们都知道既然叫垃圾回收,那回收的就应该是垃圾,可是我们怎么知道哪些对象是垃圾呢? 哪些对象需要被回收 ...

  6. Java 知识笔记 - 类、集合、多线程、IO、JVM(最后一次更新,2019年02月17日)

    目录 Class 内部类.静态内部类.匿名内部类.局部内部类 Collection Java Collection Set Queue Map Collections Arrays System Co ...

  7. 【JVM】02垃圾回收机制

    垃圾回收 垃圾回收策略https://blog.csdn.net/u010425776/article/details/51189318 程序计数器.Java虚拟机栈.本地方法栈都是线程私有的,也就是 ...

  8. 02 jvm简介

    声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...

  9. 02. JVM运行机制

    JVM运行机制 JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程

  10. 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新

    从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...

随机推荐

  1. Python Revisited (变量)

    目录 = 浅拷贝 深拷贝` 函数的默认参数为可变类型时 危险 全局变量与临时变量 global 在函数里面进行复制 再看一个例子 numpy里的bug? 待续 @ 首先,需要指出的是,Python的变 ...

  2. php中header函数参数的Cache-control的使用方法

    网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为private.其作用根据 ...

  3. asp.net core Serilog的使用

    先贴上关于使用这个日志组件的一些使用方法,等有时间了在吧官方的文档翻译一下吧,现在真是没时间. Serilog在使用上主要分为两大块: 第一块是主库,包括Serilog以及Serilog.AspNet ...

  4. Shell命令-文件及内容处理之split、paste

    文件及内容处理 - split.paste 1. split:分割文件为不同的小片段 split命令的功能说明 split 命令用于将一个文件分割成数个.该指令将大文件分割成较小的文件,在默认情况下将 ...

  5. Cut 'em all! CodeForces - 982C(贪心dfs)

    K - Cut 'em all! CodeForces - 982C 给一棵树 求最多能切几条边使剩下的子树都有偶数个节点 如果n是奇数 那么奇数=偶数+奇数 不管怎么切 都会有奇数 直接打印-1 贪 ...

  6. mpvue——API请求封装(小程序原生)

    前言 能用,但不是最好的方法,最好的还是fly,因为为了以后多平台的考虑,最好使用fly.js,做之前先关闭校验合法域名,因为我没在后台进行配置 后台进行配置合法域名,按着官方给的配置就OK了,这里就 ...

  7. 2.5 time 模块

  8. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  9. 从零开始部署javaWeb项目到阿里云上面

    [详情请看]http://www.cnblogs.com/softidea/p/5271746.html 补充几点特别需要注意的事情 一:putty相当于阿里云的控制台, WinSCP 相当于是专门上 ...

  10. Springboot 3.需求携带参数的get请求

    还是拿来上节讲的代码: package com.course.server; import org.springframework.web.bind.annotation.*; import java ...