jvm内存区域总体分为5大块:方法区,java堆,虚拟机栈,本地方法栈,程序计数器,按照线程来分的话又分为线程共享区和线程独占区

程序计数器:

a、程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器

b、此区域是唯一一个在java虚拟机规范中没有任何outofmemoryerror情况的区域

c、如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法(即本地方法栈服务的方法),这个计数器的值为undefined

本地方法栈:

a、本地方法栈为虚拟机执行native方法服务(虚拟机栈为虚拟机执行java方法服务)

虚拟机栈:

a、虚拟机栈描述的是java方法执行的动态内存模型

b、栈帧,每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储局部变量表(存放编译期可知的各种基本数据类型,引用类型,returnaddress类型,局部变量表的内存空间在编译期间完成分配,当进入一个方法,这个方法需要在帧分配多少内存是固定的,在方法运行期间不会改变局部变量表的大小),操作数栈,动态链接,方法出口等。

c、可能出现StackOverflowError、OutOfMemory等异常

java堆:

a、存放对象实例

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

c、堆被划分为两个不同的区域:新生代、老年代,新生代又被划分为三个区域:Eden、From Survivor、To Survivor

d、堆大小可通过参数-Xms、-Xmx来指定

e、会抛出OutOfMemory异常

方法区:

a、存储运行时常量池,已被虚拟机加载的类信息(类的版本,字段,方法,接口),常量(储存编译器生成的各种字面量和符号引用),静态变量、即时编译器编译后的代码等数据。

b、方法区中很少进行垃圾回收,但是会执行垃圾回收,回收效率比较低,如对常量池的回收,对象类型的卸载等。

c、会抛出异常OutOfMemoryError

注意:

如果Strng s1 = "abc"   String s2 ="abc"  s1==s2 输出为true

因为,定义s1的时候,在堆中创建对象,并记录在方法区的运行时常量池的StringTable表中,再定义s2的时候发现StringTable中已经记录了这个对象,就不在堆中创建新的对象了,s2会指向第一个abc,而不是图中的第二个

如果String s3 =new String("abc") ,则是s1==s3为false 直接在堆中开辟一块空间,而不再去考虑常量池的问题。如果,s1==s3.intern() 则返回为true,intern()方法会将s3的“abc”移动到运行时常量池中去(即产生一个运行时常量),但常量池中已经有“abc”所以相等。

注意,还有直接内存(主要是nio使用)的存在,其不受虚拟机内存的制约,但是受到物理内存的制约。

jvm(二):内存管理的更多相关文章

  1. JVM的内存管理机制-转载

    JVM的内存管理机制 一.JVM的内存区域 对于C.C++程序员来说,在内存管理领域,他们既拥有每一个对象的"所有权",又担负着每一个对象生命开始到终结的维护责任. 对Java程序 ...

  2. jvm的内存管理【转】

    [转]JVM内存管理 这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,能沉淀下来的就是自己的! 首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过java ...

  3. Android笔记--Bitmap(二)内存管理

    Bitmap(二) 内存管理 1.使用内存缓存保证流畅性 这种使用方式在ListView等这种滚动条的展示方式中使用最为广泛, 使用内存缓存 内存缓存位图可以提供最快的展示.但代价就是占用一定的内存空 ...

  4. JVM的内存管理机制

    在做Java开发的时候常用的JVM内存管理有两种,一种是堆内存,一种是栈内存.堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对 ...

  5. JVM自动内存管理学习笔记

    对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...

  6. JVM自动内存管理机制——Java内存区域(上)

    一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...

  7. JVM自动内存管理机制--读这篇就GO了

    之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...

  8. Spark(二): 内存管理

    Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块: Spark的内存可以大体归为两类:execution和storage,前者包括shuffles.joins.sor ...

  9. JVM自动内存管理-Java内存区域与内存溢出异常

    摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...

  10. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

随机推荐

  1. Entity Framework Core Code First

    参考地址:https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db

  2. Python内置函数(16)——ord

    英文文档: ord(c) Given a string representing one Unicode character, return an integer representing the U ...

  3. SpringCloud的应用发布(二)vmvare+linux,Centos7.0下发布应用

    一.运行环境 1.jdk下载安装 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 检查是否有老版本jdk 如 ...

  4. 修改hosts 流畅使用coursera

    以管理员权限打开 C盘 ->  Windows-> System32 -> drives -> etc -> hosts文件 在hosts文件最后写入 52.84.246 ...

  5. Lua编写wireshark插件初探——解析Websocket上的MQTT协议

    一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...

  6. Windows10+Docker搭建分布式Redis集群(一)

    摘要,Docker for Windows 仅支持专业版 目录 第一步:检查系统支持虚拟化 第二步:下载Docker对应版本 第三步:配置镜像加速 第一步:检查系统是否支持虚拟化 Docker前提是需 ...

  7. 复习HTML+CSS(4)

    n  HTML颜色表示 网页中的颜色有三种表示方法 颜色单词:blue.green.red.yellow 10进制表示:rgb(255,0,0).rgb(0,255,0).rgb(0,0,255) 1 ...

  8. hdu1010 Tempter of the Bone---DFS+奇偶剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述:根据地图,'S'为开始位置,'D'为门的位置,' . '为空地,'X'为墙,不能经过 ...

  9. 【Jhipster】升级/修改 数据库结构

    前提 1.jhipster环境,jdk1.8,yeoman,node.js安装环境参考官方wiki,环境问题参考我的博客,如果出现注册中心空白页,请参考博客 2.首先需要启动jhipster基础服务, ...

  10. 原来你是这样的Promise

    1. Promise简介 promise是异步编程的一种解决方案,它出现的初衷是为了解决回调地狱的问题. 打个比方,我需要: --(延迟1s)--> 输出1 --(延迟2s)--> 输出2 ...