1.java内存模型分析

java虚拟机运行时数据存储区域包括线程隔离和线程共享两类,整个PC的内存图如下所示:

下面对以上内存区域说明:

1.1 register和cache

当代计算机一般有多个cpu,每个cpu有独立的寄存器用于运行时存储数据,同时每个cpu一般还会有1级或者多级高速存储的缓存,当cpu读取数据时,总是会先从缓存中读取,如果缓存中没有时才会读取主内存中的数据,先把数据加载到缓存中,然后再从缓存中读取数据;cpu写数据时,也总是会先写到缓存中,然后再某一个时间点刷新缓存,将缓存中的数据写入到主内存中。由于这种工作方式,当多线程并发执行时候,可能会出现线程间数据不可见,以及访问共享资源时会出现冲突的问题。详细介绍参考:

2.线程隔离内存区域-programmer counter

每个线程都有一个程序计数器,当执行java方法的时候,次计数器的作用是用来保存次线程下一个需要执行的指令的地址。当执行navtive方法的时候,此计数器为undifined,下一条执行由本地程序计数器管理

3.JVM stack

每个线程都有一个虚拟机栈,此内存区域在线程创建的时候分配,此虚拟机栈用于调用方法,并执行方法的计算机指令,虚拟机栈可以动态分配,也可以指定初始化大小。
此块内存区域会抛出以下两种异常:
1.StackOverflowError,当计算时候请求的内存大小大于允许的最大值。
2.OutOfMemoryError,当动态分配内存的时候,已经没有可用内存非配给新建的线程时候会抛出此异常。

4.堆

堆内存是所有线程共享的内存区域,此内存区域在虚拟机启动的时候就由虚拟机进行分配,堆内存的大小可以固定大小,也可以动态分配,实现方式由具体的jvm来决定。我们所有使用new关键字创建的对象实例都保存在此内存区域内,此内存区域也是垃圾回收的主要区域。此内存区域会抛出以下异常:
OutOfMemoryError:当没有空间分配给新建的对象实例的时候会抛出此异常。

5.方法区

方法区在逻辑上是数据堆的一部分,同样是所有线程共享的内存区域,在虚拟机启动的时候分配此内存,主要用于保存所有的类文件,包括类文件中的常量池、类方法、构造方法、类变量等数据。类加载的时候,会将这些信息保存到此内存区域。此内存区域由可能抛出以下异常:
OutOfMemoryError:当没有可用内存空间分配给新的类信息时候,会抛出此异常。

6.运行时常量池

运行时常量池是用于保存类文件或者接口文件中的常量表中的数据,此数据包括编译时可知的字面值常量和运行时需要解析的方法引用和Object变量引用等。此内存区域由方法区分配,在虚拟机加载类的时候会为每个类分配一个对应的类属常量池。此内存区域会抛出以下异常:OutOfMemoryError,当没有可用内存分配给内存申请的时候会抛出此异常。具体内存分配信息参考:

JVM内存分析的更多相关文章

  1. 大数据学习--day13(字符串String--源码分析--JVM内存分析)

    字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...

  2. 学习记录--JVM内存分析

    今天刷牛客网的题时,看到了两位大神关于JVM内存分析的讲解,就顺手记录学习一下. JVM内存模型图 方法区域存放了所加载的类的信息(名称.修饰符等).类中的静态变量.类中定义为final类型的常量.类 ...

  3. Day05_22_实例化对象的JVM内存分析

    创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ...

  4. 利用MAT玩转JVM内存分析(一)

    本文首发于公众号:javaadu 尽管JVM提供了自动内存管理的机制,试图降低程序员的开发门槛,确实也实现了这一目标,在日常开发中,我们一般都不需要关心对象的内存释放.JVM大部分都是使用trace算 ...

  5. 说下Java堆空间结构,及常用的jvm内存分析命令和工具

    Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...

  6. JVM堆空间结构及常用的jvm内存分析命令和工具

    jdk8之前的运行时数据区域 程序计数器 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.每个线程都有一个独立的程序计数器,这类内存区域为"线程私有",此内存 ...

  7. JVM 内存分析

    简述JVM垃圾回收机制 垃圾回收机制时Java提供的自动释放内存空间的机制. 垃圾回收机制时JVM自导的一个线程,用于回收没有被引用的对象. JVM有一个运行时的数据区来管理内存.其主要包括五大部分: ...

  8. JVM内存分析工具MAT使用

    1. 首先去官网下载MAT软件,路径如下: 点击打开链接 2. 将heap dump文件打开即可分析.

  9. 配置JVM内存 查看内存工具

    一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...

随机推荐

  1. Language Modeling with Gated Convolutional Networks

    语言模型 所谓的语言模型,即是指在得知前面的若干个单词的时候,下一个位置上出现的某个单词的概率. 最朴素的方法是N-gram语言模型,即当前位置只和前面N个位置的单词相关.如此,问题便是,N小了,语言 ...

  2. Orleans之EventSourcing

    Orleans之EventSourcing 这是Orleans系列文章中的一篇.首篇文章在此 引入: 如果没有意外,我再这篇文章中用ES代替EventSourcing,如果碰到"事件回溯&q ...

  3. msp430系统时钟

    转自 http://m.blog.csdn.net/blog/msdumin/38441493# MSP430基础时钟模块包含以下3个时钟输入源. 一.4个时钟振荡源 1.LFXT1CLK:  外部晶 ...

  4. UITableView 的使用小点

    1.系统默认的颜色设置//无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...

  5. angularjs MVC、模块化、依赖注入详解

    一.MVC <!doctype html> <html ng-app> <head> <meta charset="utf-8"> ...

  6. HashMap中的散列函数、冲突解决机制和rehash

    一.概述 散列算法有两个主要的实现方式:开散列和闭散列,HashMap采用开散列实现. HashMap中,键值对(key-value)在内部是以Entry(HashMap中的静态内部类)实例的方式存储 ...

  7. 【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系

    上一章:[Unity3D技术文档翻译]第1.3篇 创建 AssetBundles 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Develo ...

  8. ActiveRecord的生命周期

    ActiveRecord的生命周期,通过方法重写和插入我们需要的业务逻辑来达到我们对程序的控制. 示例: 1,beforeSave() public function beforeSave($inse ...

  9. 利用alias在Linux下设置命令别名

    alias          //自定义命令="Linux命令"   alias          //查看当前系统里所有的自定义命令 unalias         //自定义命 ...

  10. Hibernate Error: a different object with the same identifier value was already associated with the session

    在执行Hibernate的Update操作时,报错:a different object with the same identifier value was already associated w ...