JVM内存分配
内存分配:当JVM运行起来的时候就会给内存划分空间,那么这块空间称之为运行时数据区。
(备注:当一个Java源程序编译成class字节码文件之后,字节码文件里存放的都是二进制的汇编命令,当程序运行的时候,JVM会将这个二进制的命令逐行解释,交给CPU去执行)
运行时数据区将划分为以下几块内容:
1)栈:
每一个线程运行起来的时候就会对应一个栈(线程栈),栈当中存放的数据是被当前线程所独有的。而栈当中存放的是栈帧,当线程调用一个方法的时候,就会形成一个栈帧,并将这个栈帧进行压栈操作,当方法执行完之后就会将这个栈帧进行出栈操作。这个栈帧里面包括(局部变量、操作数栈、指向当前方法对应类的常量池引用、方法的返回地址等信息)。
(备注:由于局部变量都是存放在栈中,而每一个线程都对应自己的线程栈,因此局部变量是线程安全的,不会产生资源共享的情况。)
2)本地方法栈:
本地方法栈的机制和栈的机制类似,区别在于,栈是运行Java所实现的方法,而本地方法栈是运行的本地方法(Native Method)。所谓的本地方法指的是在本地jvm中需要调用非Java语言所实现的方法,例如c语言。在JVM的规范中,其实没有强制性要求实现方一定要划分出本地方法栈的和具体的实现,这一部分可以根据实现方具体要求来实现。因此在HotSport虚拟机的实现中就将方法栈和本地方法栈二合为一。
3)程序计数器:
程序计数器也可以称之为PC寄存器。它主要用于存放当前程序下一条将要执行的指令地址。CPU会根据这个地址找到对应的指令来执行。通俗的讲就是指令缓存。这个寄存器是有JVM内部实现的,并不是物理概念上的寄存器,但是JVM在实现功能的逻辑上是相同的
4)堆:
堆内存中主要存放创建的对象以及数组。 堆内存是可以被多个线程所共享的一块区域,因此多个线程栈都可以去访问同一块堆的内存区域。堆里面的每一对象都存放了该实例的实例变量。 当方法中定义了一个局部变量,如果这个变量是基本数据类型,那么这个变量的值就直接存放在栈中,如果这个变量是引用数据类型,那么这个对象变量就存放在堆内存中,而栈中存放的是一个指向堆内存中这个对象的首地址。
(备注:Java中除了8个基本数据类型以外的所有类型都是引用数据类型)
实例变量和静态变量的区别:
实例变量:实例变量是随着对象的创建而创建,而实例是存放在堆中,所以实例变量自然也就跟实例一并保存在堆内存。只要创建多少个实例,就会有多少份实例变量。当实例被回收的时候,实例变量也随之而销毁。
静态变量:静态变量也叫类变量,它是在类加载的时候就已经初始化好,并存放在方法区,并且只有一份,所以它是被多个实例所共享的一个变量。
5)方法区:
方法区在JVM中也是一个非常重要的一块内存区域,它和堆一样,是可以被多个线程所共享的一块区域。这个区域中主要存放了每一个加载的class文件信息。在一个class文件中主要包含魔数(用来确定是否是一个class文件)、常量池(常量池在下面会有完整说明)、访问标志(当前的class是类还是接口,是否是抽象类,是否是public修饰,是否使用了final修饰等描述信息...)、字段表集合信息(使用什么访问修饰符、是实例变量还是静态变量,是否用final修饰等描述信息...)、方法表集合信息(访问修饰符,是否静态方法,是否用final修饰,是否用了synchronized修饰,是否是native方法...)等内容。当一个类加载器加载一个class文件的时候,会根据这个class文件的内容创建一个Class对象,而这个Class对象就包括了上述的这些内容。后续要创建这个类的所有实例,都是通过这个Class对象创建出来的。
6)常量池:
常量池也是方法区中的一部分,它存放的内容是class文件中最重要的资源,JVM为每一个class对象都维护一个常量池。它主要存储两种类型的常量。
1. 字面常量:
字面常量通常就是在Java中定义的字面量值,如:int i =1,这个1就是字面量;String s = "hello",这个hello就是字面量。或者使用final修饰的常量值等等。
2. 符号引用:
符号引用主要包括类和接口的完整类名、属性字段的名称和描述符、方法名称和描述符等信息。
在Java当中,8个基本数据类型都有对应的包装类型,而大部分包装类型都实现了常量池的技术,除了Double和Float类。
(备注:在JDK8之后,方法区已经取消,方法区被一个叫MetaSpace,它和和堆合并到一起管理)
JVM内存分配的更多相关文章
- 最简单例子图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- JVM内存分配与垃圾回收机制管理
项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...
- Linux下tomcat运行时jvm内存分配
tomcat运行时jvm内存分配 ⑴开发环境下在myeclipse中配置-Xms256m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:PermSi ...
- JVM 内存分配模型概念和java中各种对象的存储
JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了<深入理解Java虚拟机JVM高级特性与最佳实践> 一书后,总结所得.写的不 ...
- 最简单例子图解JVM内存分配和回收(转)
本文转自http://ifeve.com/a-simple-example-demo-jvm-allocation-and-gc/ http://www.idouba.net/a-simple-exa ...
- 一个可以参考的JVM内存分配
下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version >& | -bit` if [ -n " ...
- (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
在linux环境下配置项目运行环境时,部署的人员都会分配一下内存,以保证程序正常的运行.其实在开发的时候(window系统),就已经涉及到内存分配了,只是这些参数有默认值,因此一直没有去重视它. 以M ...
- 第二章 JVM内存分配
注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚 ...
- Android性能调优篇之探索JVM内存分配
开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...
- JVM内存分配及String常用方法
一,JVM内存分配和常量池 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的.如下图所示(注意:在jdk1.8之后便没有方法区了): 如上JVM将内存分为 ...
随机推荐
- ios开发——错误总结篇&开发中常见错误和警告总结(四)
ios开发——开发总结&开发中常见错误和警告总结(四) 网易彩票实战总结(错误) 错误总结之类的实现 经典错误之重复定义与导入错误 经典错误关于父类的实现 通知对象: 控制器的定义 Xcode ...
- Perl小知识点之排序sort
脚本这种东西,就是要常用,否则一段时间不用就生疏了,因此决定时时记一些小知识点,一来回顾一下,二来需要的时候可以迅速获得提示. Sort by number You could now write a ...
- 深入理解 CSS 中的行高与基线
1.基本概念 1. 基线.底线.顶线.中线 注意:基线(base line)并不是汉字文字的下端沿,而是英文字母“x”的下端沿. 2. 内容区 内容区是指底线和顶线包裹的区域(行内元素display ...
- 1.5 理解Analyzers,Tokenizers,Filters--目录
这部分介绍了solr如何分解和处理文本数据的,它包含一下主题: 1.5.1 Analyzers,Tokenizers,Filters概述:主要介绍Analyzers,Tokenizers,Filter ...
- How to solve the SVDI SN Number Display Problem
Yesterday we have learn how to find the SVDI Serial Number, today one of customer from UK look our a ...
- [翻译] CBStoreHouseTransition
CBStoreHouseTransition What is it? A custom transition inspired by Storehouse iOS app, also support ...
- IOS开发UI篇之tableView 的用法详解
1.我们知道tableView是IOS中的高级视图,其继承与ScrollView,故我们知道他有具有ScrollView的所有功能.而且还扩展了许多.当然在这里就不一一介绍了. 2.tableView ...
- 10个实用的但偏执的Java编程技术
在沉浸于编码一段时间以后,你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用"防御性编程",即一些偏执习惯的原因.下面是我 ...
- Oracle基础 PL-SQL编程基础(1) 变量和常量
一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...
- java程序执行内存处理过程
我们学习知识,不仅要知其然,还要知其所以然,你的工资必定和你学习的深度成正比. 在以往.net的学习过程中,我们了解了怎么去开发一个程序,并有了一定的开发经验,但是一个程序具体是怎么在内存中运行的呢? ...