JVM-java内存管理(1)

介绍的问题:

1.虚拟机中的内存是如何划分的?

2.具体分为哪些区域?

3.什么操作会导致内存溢出或异常?

1)这些区域中,有的区域会随着虚拟机进程的启动而存在,有些区域是以来用户线程的启动和结束而建立和销毁

名词解释:

1)程序计数器:是一块较小的内存空间,作用可以看做当前线程所执行的字节码的行号指示器。(注意:Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,一个内核一次只会执行一个线程中的指令,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,这个属于线程私有)

2)虚拟机栈:每个方法被执行时都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法从被调用到执行完成的过程就对应着一个栈帧在虚拟机中入栈到出栈的过程。(注意:虚拟机栈是线程私有的,它的生命周期与线程相同。)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;当扩展时无法申请到足够的内存是会抛出OutOfMemoryError异常。

3)本地方法栈:与Java虚拟机栈作用相似,虚拟机栈为执行Java方法服务,本地方法栈为虚拟机使用到的Native方法服务。抛出异常与虚拟机栈类似。

**4)Java堆:**Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。唯一作用就是存放对象实例。Java虚拟机规范描述是:所有的对象实例以及数组都要在堆上分配,但随着JIT编辑器的发展和逃逸技术的成熟,栈上分配、标量替换等优化技术使得分配方式不是唯一的。(逃逸技术:?? 标量分配:)Java堆页称GC堆,可以细分为新生代和老年代,再细分为Eden空间、From Survivor空间、To Survivor空间等。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

5)方法区:是各个线程共享的内存区域,作用是存储已经被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。当该区域无法满足内存分配时,将会抛出OutOfMemoryError异常。

6)运行时常量池:方法区的一部分。要说运行时常量池,先了解一下文件常量池,即Class文件中的常量池,Class文件中除了保存类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

**7)直接内存:**nio中引入了一种基于通道与缓冲区的I/O方式,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,显著的提高了性能。受本机内存的限制。

对象访问:主要访问方式是使用句柄和直接指针。

**句柄方式:**Java堆中将会划分出一块内存来作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了对象实例数据和类型数据各自的具体地址信息。

**直接指针方式:**Java堆对象的布局中需要考虑如何放置类型数据的相关信息,reference中直接存储的就是对象地址。

两者比较:句柄方式最大的好处是reference中存储的是稳定的句柄地址,在对象移动是只会改变句柄中的实例数据指针,而reference本身不需要被修改;

直接指针访问方式最大的好处是速度更快.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 12:13:49

JVM-java内存管理(1)的相关文章

java内存管理

一.jvm内存结构 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) (1)PCR 跟随线程生命周期,记录当前执行到的.class字节码行数,用于多线程操作 (2)JVM Stacks 跟随线程生命周期,在方法执行中存储数据 (3)Native Method Stacks 处理native方法,如object中的hashCodes()等

简单的例子 关于Java内存管理的讲解

我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? 两处位置都打印了,位置一得到base64,ok,没问题.当我在位置二想使用base64时,问题来了?onload队列的问题,位置二总是无法正确的获取到想要的base64,这个时候就可以考虑异步问题了. 在还没有接触到angular的时候,还真的不知道它到底有什么作用,直到我开始学习它,并且运用到它

java内存管理机制

JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 

【Java】Java内存管理

Java内存管理是面试中经常会问到的问题.Java的内存管理其实是指对象 的分配和释放问题.曾经看过这样一句话:"C++程序员觉得内存管理太重要了,所以一定要自己进行管理,而Java程序员觉得内存管理太重要了,一定不能自己管理".我觉得这句话说得太精辟了. C++程序员需要显式分配内存,释放内存,而这样常常会引起"内存泄露".而Java程序员不需要显式分配和释放内存,Java在创建对象的时候会自动分配内存,在对象不再使用的时候释放内存.Java的对象是通过new关键

jvm的内存管理【转】

[转]JVM内存管理 这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,能沉淀下来的就是自己的! 首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过javac命令编译后,编译成class文件,class文件中都是二进制格式的数据,所以想要看编译后的内容是什么,可以采用jdk自带的javap命令查看. 记得刚学java的时候觉得java虚拟机厉害的很,java的风光正是建立在它的功劳之上.JVM (java vitual machine).JVM中有个组

Java内存管理第二篇 - 内存的分配

Java内存管理无非就是对内存进行分配和释放.对于分配来说,基本类型和对象的引用存储到栈中,常量存储到常量池中,对象存储到堆上,这是一般的分配.而对于回收来说要复杂的多,如果回收不好,还可能造成分配出去的内存得不到回收而造成内存泄漏. 这一篇将简单介绍一下Java内存的分配,下一篇将介绍内存的回收及内存泄漏等知识. 1.JVM内存模型 1.程序计数器(Program Counter Register): 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是

JAVA内存管理再解

首先我们要明白一点,我们所使用的变量就是一块一块的内存空间!! 一.内存管理原理:   在java中,有java程序.虚拟机.操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统间交互!这就保证了java程序的平台无关性!下面我们从程序运行前,程序运行中.程序运行内存溢出三个阶段来说一下内存管理原理! 1.程序运行前:JVM向操作系统请求一定的内存空间,称为初始内存空间!程序执行过程中所需的内存都是由java虚拟机从这片内存空间中划分的. 2.程序运行中:java程序一直向java

Java内存管理的进一步理解-模拟过程图解

Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      (1):基本信息:      1)每个类的全限定名       2)每个类的直接超类的全限定名(可约束类型转换)      3)该类是类还是接口      4)该类型的访问修饰符      5)直接超接口的全限定名的有序列表      (2):每个已装载类的详细信息:      1)运行时常量池:

揭开Java内存管理的面纱

前言 相对于C.C++这些高性能语言,Java有着让此类程序员羡慕的功能:内存自动管理.似乎这样,Java程序员不用再关心内存,也不用去了解相关知识.但结果真的是这样吗?特别对于我们这种Android程序员来说,对内存可是吃得死死的,一旦出现较为复杂的内存泄露和溢出方面的问题,简直就是噩梦.因此,对Java内存管理有个大体的了解似乎已经成为一个合格的Android程序员必备的技能,就算是新进的Kotlin同样是基于JVM的.不如趁此机会,大家一起来揭开它的面纱. 对象 Java是一门面向对象的编

java内存管理机制(一)-运行时数据区

前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了三遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from java内存管理机制(一)-运行时数据区  1. java内存管理机制-运行时数据区 2. java内存管理机制-内存分配 3. java内存管理机制-垃圾回收 正文 C++与java之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙里的人却想出来…… 与C.C++程序员时刻要关注着内存的分配与释放