java虚拟机有的区域随着虚拟机进程的启动而存在,
有的区域依赖用户线程的启动和结束而建立和销毁。
  • 程序计数器:为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器。(针对java方法,即栈)
  • 虚拟机栈:为了虚拟机执行java方法,线程创建时就会创建一个栈帧,存储局部变量表、操作数栈、动态链接等。
       StackOverFlowError:线程请求的栈深度大于虚拟机所允许的深度;
       OutOfMemoryError:动态扩展是无法申请到足够的内存。
  • 本地方法栈:为了虚拟机使用到Native法服务。
  • 堆:存放对象实例和数组,为对象实例分配内存。可分为新生代和老年代。可以处于物理上不连续的内存空间中,只要逻辑上连续即可。

-Xmx和-Xms控制大小。

  • 方法区:存储类信息、常量、静态变量、编译后的代码等数据。也叫“永久代”,可以像Java堆一样管理这部分内存。

1.6以后将字符串常量池放入了堆空间。

  • 运行时常量池:存放编译期生成的各种字面量和符号引用。

intern()方法设计的初衷,就是重用String对象.如下测试验证。

<wiz_code_mirror>

 
 
 
 
 
        String a1 = new String("dog") + new String("Pig");//不会在常量池创建对象。
//        String a1 = new String ("dogPig");//在常量池和堆空间创建对象
        System.out.println(a1 == a1.intern());//在常量池查找不存在,1.6直接生成。1.7直接生成后,指向堆空间的引用。
        System.out.println(a1 == "dogPig");//true
        String str2 = "dogPig";//新加的一行代码,其余不变
        System.out.println(a1 == str2);//true
 
 

内存分配:

桟:存储对象的引用,局部变量的基本数据类型,速度快,自动销毁;
堆:存储new出来的对象,数组,成员变量的基本数据类型;
常量池:属于方法区,存储final的变量和方法;
静态域:属于方法区,存储static的变量和方法;
方法区:存储二进制class字节码。

Demo demo=new Demo();

这一条语句,其实包括了四个动作:

1)右边的“new Demo”,是以Demo类为模板,在堆空间里创建一个Demo对象。
     2)末尾的()意味着,在对象创建后,立即调用Demo类的构造函数,对刚生成的对象进行初始化。 
     3)左边的“Demo demo”创建了一个Demo类引用变量,它存放在栈空间中。也就是用来指向Demo对象的对象引用。 
     4)“=”操作符使对象引用指向刚创建的那个Demo对象。

 

java虚拟机内存区域理解的更多相关文章

  1. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

    一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...

  2. 一文解析总结Java虚拟机内存区域模型

    最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...

  3. 总结Java虚拟机内存区域模型

    本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...

  4. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  5. Java虚拟机内存区域堆(heap)的管理

    在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域 ...

  6. java虚拟机内存区域

    java虚拟机运行时数据 程序计数器 是一块较小的内存空间,属于线程私有的内存. 用来记录正在执行的虚拟机字节码指令的地址. 每个线程都需要一个独立的程序计数器,各个线程间的计数器互不影响,独立存储. ...

  7. 【四】Java虚拟机内存区域初识

     一.线程独占区  1.程序计数器 程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码 ...

  8. Java虚拟机 内存区域划分

    (图片来自https://www.cnblogs.com/whgk/p/6138522.html) 先从线程私有区开始介绍 虚拟机栈 Java虚拟机栈是由一个个栈帧组成的,当一个方法被调用时,代表这个 ...

  9. 一、java虚拟机内存区域

    内存区域 java虚拟机在java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.java虚拟机规范将JVM管理的内存分为:程序计数器.本地方法栈.Java虚拟机栈.方法区.Java堆.如下 ...

随机推荐

  1. POJ 3090 坐标系上的视线遮蔽问题

    Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal ...

  2. Android Application基本组成部分

    Android Application基本组成部分 四个核心的组件 Activity活动,主要用于前台和用户交互,即UI,Activity只是加载一个View而并非一个UI对象 Service服务,主 ...

  3. apache cgi 模块安装

    apache安装,请参照:http://httpd.apache.org/docs/2.4/ 安装系统: Fedora release 21 (Twenty One)  (x64) 版本:Server ...

  4. Gearman 初窥【转载】

    Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于Live ...

  5. POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】

    题意: 给一个无向图,找1到n所有的路中每条路最小权值的最大值! 屌丝一开始的思想是利用dij的变形~ 但是==屌丝忘记了更新dis数组~结果TLE无数次... 说正经的~dij的变形思想是这样的if ...

  6. 【.Net 学习系列】-- EF Core实践(Code First)

    一.开发环境: vs2015, .Net Framework 4.6.1 二.解决方案: 新建一个控制台应用程序 添加引用:Microsoft.EntityFrameworkCore.SqlServe ...

  7. 关于oracle存储过程的若干问题备忘

    1.在oracle中,数据表别名不能加as,如: select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- ...

  8. 选带傅里叶变换(zoom-fft)

    选带傅里叶变换的原理大家能够看书.大致的步骤为 移频 (将选带的中心频率移动到零频) 数字低通滤波器  (防止频率混叠) 又一次採样  (将採样的数据再次间隔採样,间隔的数据取决于分析的带宽,就是放大 ...

  9. 微信小程序 自定义组件(modal) 引入组件

    项目结构: 步骤一:创建组件 声明这一组文件为自定义组件 modal.json { "component": true, // 自定义组件声明 "usingCompone ...

  10. python的线程thread笔记

    python的线程是用thread和threading来实现的.其中利用threading会更好,因为thread没有线程保护,当主线程退出了之后,子线程也会被强行退出.threading支持守护线程 ...