精华内容
下载资源
问答
  • JVM架构内存结构

    万次阅读 2020-09-14 03:40:54
    在线分享地址:JVM内存结构

    在线分享地址:JVM内存结构图
    在这里插入图片描述

    展开全文
  • JVM01_JVM内存结构

    万次阅读 2020-08-20 15:11:00
    JVM内存结构 1. 程序计数器 Program Counter Register 作用: 记住 当前线程 的下一条 JVM字节码指令 的 执行地址 ,便于进行 线程切换 特点: 是 线程私有 的,保证了各线程不会互相影响 不会存在内存溢出 为...

    JVM内存结构

    在这里插入图片描述


    1. 程序计数器 Program Counter Register

    作用: 记住 当前线程 的下一条 JVM字节码指令执行地址 ,便于进行 线程切换

    特点:

    1. 线程私有 的,保证了各线程不会互相影响
    2. 不会存在内存溢出
    为什么要使用PC寄存器记录当前线程的执行地址呢?
    答:因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。
    
    PC寄存器为什么会被设定为线程私有?
    答:多线程在一个特定的时间段内只会执行其中某一个线程方法,CPU会不停的做任务切换,这样必然会导致经常中断或恢复。
    为了能够准确的记录各个线程正在执行的当前字节码指令地址,所以为每个线程都分配了一个PC寄存器,
    让每个线程都独立计算,不会互相影响。
    

    2. Java虚拟机栈 JVM Stacks

    虚拟机栈是 线程运行 需要的内存空间

    一个栈由多个 栈帧 组成,栈帧对应 方法调用 时占用的内存空间,每个线程只能有一个 活动栈帧

    栈帧用于存放基本数据类型、对象的引用、方法出口等,是 线程私有

    问题1:垃圾回收是否涉及栈内存?
    答:不涉及,栈内存是JVM自动管理的,方法调用时入栈,方法运行结束后栈帧出栈,内存自动释放。
    
    问题2:栈内存分配越大越好吗?
    答:不是,因为物理内存的大小是一定的,所以栈内存越大,线程数就越小。
    
    问题3:方法内的局部变量是否是线程安全的?
    如果方法内的局部变量没有逃离方法的作用范围,它就是线程安全的。
    如果局部变量引用了对象并逃离了方法的作用范围,它就有线程安全问题。
    

    栈内存溢出:StackOverflowError

    方法过多导致栈内存溢出: 无递归边界的递归调用
    栈帧过大导致栈内存溢出

    分配栈内存的大小:

    -Xss1m
    

    线程运行诊断:

    案例1:cpu占用过高

    步骤1:top命令查看进程的cpu占用情况,锁定进程id
    
    步骤2:用如下命令进一步定位占用出问题的线程id:
    ps H -eo pid,tid,%cpu | grep 进程id
    
    步骤3:将10进制的线程id转成16进制,比如32665 ==> 7F99
    
    步骤4:使用jstack命令查看进程信息,根据线程id 7F99查找线程,可看到线程的详细信息,进而定位出问题代码的行数
    jstack 进程id
    

    3. 本地方法栈 Native Method Stacks

    本地方法栈 是JVM给 本地方法 的调用提供内存空间的栈

    本地方法 是由其他语言(C、C++ 、汇编语言)编写的与操作系统底层交互的api


    4. 堆 Heap

    通过 new 关键字创建的对象都会使用堆内存

    堆是 线程共享 的,堆中对象需要 考虑线程安全问题

    垃圾回收机制 ,堆中不再被引用的对象将被回收释放

    堆内存溢出:java.lang.OutOfMemoryError:java heap space

    public static void main(String[] args) {
    	int i = 0;
    	ArrayList<String> list = new ArrayList<>();
    	String a = "BLU";
    	try {
    		while(true) {
    			list.add(a);
    			a = a+a;
    			i++;
    		}
    	} catch (Throwable e) {
    		e.printStackTrace();
    		System.out.println(i);
    	}
    	
    }
    
    java.lang.OutOfMemoryError: Java heap space
    26
    

    分配栈空间的大小:

    -Xmx4g
    

    堆内存诊断:

    jps工具查看当前系统有哪些java进程
    jmap工具查看堆内存的占用情况
    jconsole工具:是图形界面的多功能的监测工具
    

    示例代码:

    public static void main(String[] args) throws InterruptedException {
    	System.out.println("1.....");
    	Thread.sleep(30000);
    	byte[] array = new byte[1024*1024*10];
    	System.out.println("2.....");
    	Thread.sleep(30000);
    	array = null;
    	System.gc();
    	System.out.println("3.....");
    	Thread.sleep(400000);
    }
    

    使用jmap工具测试实例:

    运行开始,控制台打印1......
    
    jps命令查看进程id:
    C:\Users\73691>jps
    12080 demo02
    
    jmap -heap 12080查看堆内存占用情况(堆内存使用1.68MB):
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 29360128 (28.0MB)
       used     = 1762032 (1.6804046630859375MB)
       free     = 27598096 (26.319595336914062MB)
       6.001445225306919% used
    
    30s后,控制台打印2......,此时byte数组对象创建完毕
    jmap -heap 12080查看堆内存占用情况(堆内存使用11.68MB):
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 29360128 (28.0MB)
       used     = 12247808 (11.680419921875MB)
       free     = 17112320 (16.319580078125MB)
       41.715785435267854% used
    
    30s后,控制台打印3......,此时byte数组对象被垃圾回收
    jmap -heap 12080查看堆内存占用情况(堆内存使用0.56MB):
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 29360128 (28.0MB)
       used     = 587224 (0.5600204467773438MB)
       free     = 28772904 (27.439979553222656MB)
       2.000073024204799% used
    

    使用jconsole工具测试示例:

    运行示例代码,使用jconsole命令打开监测工具,连接进程后即可实时查看堆内存使用情况:

    在这里插入图片描述
    使用jvisualvm监测:

    示例代码:

    public class demo03 {
    	public static void main(String[] args) throws InterruptedException {
    		List<Student> list = new ArrayList<Student>();
    		for (int i = 0; i < 200; i++) {
    			list.add(new Student());
    		}
    		Thread.sleep(100000000);
    	}
    }
    
    class Student {
    	private byte[] big = new byte[1024*1024];
    }
    

    执行,使用jconsole工具查看堆内存使用量,点击执行GC:

    在这里插入图片描述
    堆内存占用依然很高:

    在这里插入图片描述
    使用 jmap 查看详细信息(老年代Old Generation占用202.11MB):

    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 106430464 (101.5MB)
       used     = 7077904 (6.7500152587890625MB)
       free     = 99352560 (94.74998474121094MB)
       6.650261338708436% used
    From Space:
       capacity = 4718592 (4.5MB)
       used     = 0 (0.0MB)
       free     = 4718592 (4.5MB)
       0.0% used
    To Space:
       capacity = 4718592 (4.5MB)
       used     = 0 (0.0MB)
       free     = 4718592 (4.5MB)
       0.0% used
    PS Old Generation
       capacity = 304087040 (290.0MB)
       used     = 211930720 (202.11288452148438MB)
       free     = 92156320 (87.88711547851562MB)
       69.69409811085669% used
    

    使用jvisualvm工具,点击堆 Dump(堆转储)

    在这里插入图片描述
    点击查找 20 保留大小最大的对象,可以查看占用堆内存较大的对象信息:

    在这里插入图片描述


    5. 方法区 method Area

    方法区是线程共享的区,存储了类结构相关信息:类的成员变量、方法数据、方法和构造器代码,还有一个运行时常量池

    方法区在虚拟机启动时被创建,方法区逻辑上是堆的组成部分

    方法区也会内存溢出

    在这里插入图片描述
    在这里插入图片描述
    串池:StringTable

    作用:避免字符串重复创建,提升性能,减少内存的开销

    https://blog.csdn.net/soonfly/article/details/70147205

    String s1 = "a";
    String s2 = "b";
    String s3 = "a"+"b";
    String s4 = s1 + s2;	
    String s5 = "ab";
    String s6 = s4.intern();
    
    问:
    System.out.println(s3==s4);
    System.out.println(s3==s5);
    System.out.println(s3==s6);
    
    String s1 = "a"; 			串池中存入a
    String s2 = "b"; 			串池中存入b
    String s3 = "a"+"b"; 		常量的拼接,在编译期值已经确定是ab,串池中存入ab
    String s4 = s1 + s2;		相当于:new StringBuilder().append("a").append("b").toString();	new 的对象存在堆中
    所以System.out.println(s3==s4);false
    String s5 = "ab"; 			串池中已有ab,引用即可
    所以System.out.println(s3==s5);true
    String s6 = s4.intern();	尝试将字符串对象ab存入串池,并返回串池中的对象ab,所以s6引用的对象为串池中的ab
    所以System.out.println(s3==s6);true
    
    
    --------------------------------------------------------------------------------------------------------------------
    
    String x2 = new String("c")+ new String("d");
    String x1 = "cd";
    x2.intern();
    
    问:
    System.out.println(x1==x2);
    如果调换了最后两行代码的位置呢?
    如果是jdk1.6呢?
    

    StringTable的位置:在1.6中,StringTable是JVM常量池的一部分,在永久代中,1.7后,StringTable转移至堆中
    原因:永久代在 Full GC 时才会触发垃圾回收,触发事件晚,内存回收效率不高。而堆只要 Minor GC 就会触发垃圾回收


    6. 堆外内存(直接内存)

    堆外内存定义: 内存对象分配在Java虚拟机的堆以外的内存,这些内存直接 受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。使用未公开的Unsafe和NIO包下ByteBuffer来创建堆外内存。

    在这里插入图片描述


    7. 垃圾回收

    如何判断对象可以回收:

    • 引用计数法(Lisp,Python,Ruby等语言使用的垃圾收集算法)

    引用计数法的原理:
    在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。

    引用计数法存在的问题:

    1. 需要额外的空间来存储计数器,以及繁琐的更新操作。
    2. 不能处理环形数据。如果有两个对象相互引用,那么这两个对象就不能被回收,因为它们的引用计数始终为1。这就是“内存泄漏”问题。

    在这里插入图片描述

    • 可达性分析算法(java语言使用的垃圾收集算法)

    可达性分析算法的原理:
    将一系列GC Roots作为初始的存活对象合集(live set),然后从该合集出发,探索所有能够被该合集引用到的对象,并将其加入到该和集中,这个过程称之为标记(mark)。 最终,未被探索到的对象便是死亡的,是可以回收的。

    展开全文
  • JVM之内存结构详解

    万次阅读 多人点赞 2019-10-18 12:49:05
    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。...下面,开启我们的第一篇文章《JVM之内存结构详解》。 学习也是要讲究方式方法...

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。

    我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们的第一篇文章《JVM之内存结构详解》。

    学习也是要讲究方式方法的,本系列学习过程中会引导大家通过《费曼学习法》来学习,同时尽量采用图文方式来进行讲解。正所谓一图胜千言。

    思考一下

    学习一项知识总该知道为什么学习吧。有人会说,这些写代码好像又用不上,貌似所有的事情JVM都替我们做好了。那就,思考一下为什么要学习JVM虚拟机结构。

    那你是否遇到这样的困惑:堆内存该设置多大?OutOfMemoryError异常到底是怎么引起的?如何进行JVM调优?JVM的垃圾回收是如何?甚至创建一个String对象,JVM都做了些什么?

    这些疑问随着学习的深入都会慢慢得到解答,而要解决这些问题的第一步,就是先了解JVM的构成。

    JVM内存结构

    java虚拟机在执行程序的过程中会将内存划分为不同的数据区域,看一下下图。

    image

    如果理解了上图,JVM的内存结构基本上掌握了一半。通过上图我们可以看到什么?外行看热闹,内行看门道。从图中可以得到如下信息。

    第一,JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。PS:大家不要排斥英语,此处用英文记忆反而更容易理解。

    第二,JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区。图中已经用颜色区分,绿色表示“通行”,橘黄色表示停一停(需等待)。

    第三,JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小。那么最大的区域会放什么?当然就是Java中最多的“对象”了。

    学习延伸:如果你记住了这张图,是不是就可以说出关于JVM的内存结构了呢?可以尝试一下,切记不用死记硬背,发挥你的想象。

    堆(Heap)

    上面已经得出结论,堆内存最大,堆是被线程共享,堆的目的就是存放对象。几乎所有的对象实例都在此分配。当然,随着优化技术的更新,某些数据也会被放在栈上等。

    枪打出头鸟,树大招风。因为堆占用内存空间最大,堆也是Java垃圾回收的主要区域(重点对象),因此也称作“GC堆”(Garbage Collected Heap)。

    关于GC的操作,我们后面章节会详细讲,但正因为GC的存在,而现代收集器基本都采用分代收集算法,堆又被细化了。

    image

    同样,对上图呈现内容汇总分析。

    第一,堆的GC操作采用分代收集算法。

    第二,堆区分了新生代和老年代;

    第三,新生代又分为:Eden空间、From Survivor(S0)空间、To Survivor(S1)空间。

    Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。也就是说堆的内存是一块块拼凑起来的。要增加堆空间时,往上“拼凑”(可扩展性)即可,但当堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

    方法区(Method Area)

    方法区与堆有很多共性:线程共享、内存不连续、可扩展、可垃圾回收,同样当无法再扩展时会抛出OutOfMemoryError异常。

    正因为如此相像,Java虚拟机规范把方法区描述为堆的一个逻辑部分,但目前实际上是与Java堆分开的(Non-Heap)。

    方法区个性化的是,它存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    方法区的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是回收确实是有必要的。

    image

    程序计数器(Program Counter Register)

    关于程序计数器我们已经得知:占用内存较小,现成私有。它是唯一没有OutOfMemoryError异常的区域。

    程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变计数器的值来选取下一条字节码指令。其中,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成。

    Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。

    image

    因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

    如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

    虚拟机栈(JVM Stacks)

    虚拟机栈线程私有,生命周期与线程相同。

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。

    image

    局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。包括8种基本数据类型、对象引用(reference类型)和returnAddress类型(指向一条字节码指令的地址)。

    其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。

    如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

    操作数栈(Operand Stack)也称作操作栈,是一个后入先出栈(LIFO)。随着方法执行和字节码指令的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈/入栈操作。

    动态链接:Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态链接(Dynamic Linking)。

    方法返回:无论方法是否正常完成,都需要返回到方法被调用的位置,程序才能继续进行。

    本地方法栈(Native Method Stacks)

    本地方法栈(Native Method Stacks)与虚拟机栈作用相似,也会抛出StackOverflowError和OutOfMemoryError异常。

    区别在于虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈是为虚拟机使用到的Native方法服务。

    小结

    经过上面的讲解,想必大家已经了解到JVM内存结构的基本情况。下面对照脑图,归纳总结一下,看你能说出来多少。

    image

    后续更多《JVM详解》系列内容及其他面试题系列内容请关注微信公众号“程序新视界”,持续更新中。

    原文链接:《JVM之内存结构详解

    系列文章:《面试官,不要再问我“Java GC垃圾回收机制”了


    程序新视界

    关注程序员的职场生涯,大量优质学习资源、技术文章分享

    程序新视界-微信公众号

    展开全文
  • JVM内存结构

    万次阅读 2019-11-09 14:50:17
    Java虚拟机运行时数据区域被分为五个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Stack)、程序计数器(Program Count Register)。本次将根据这5个子模块详细介绍JVM的内存结构

    首先上一张代表性图片:
    在这里插入图片描述
    Java虚拟机运行时数据区域被分为五个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Stack)、程序计数器(Program Count Register)。其中我们可以看到有两个区域是线程共享的。

    堆(Heap)

    堆是JVM所管理的内存中最大的一块,被所有线程所共享,在JVM启动时创建。所有的对象实例、数组和大部分非静态成员变量储存于堆中,因此,此内存区域的唯一目的就是存放对象实例。

    Java作为一门高级语言,拥有一个非常棒的特性:内存回收无需自己操心,JVM会帮你做到。只要聊到堆,我们第一时间想到的就是:这么多的对象存放在这一大块区域上,那么Java GC机制当然也和这一块内存息息相关咯。是的,GC于堆密不可分。在这里我们只简单的介绍一下Java GC机制:

    总的来说,JVM将堆分为2个区块:新生代(Eden区+2个Survivor区)和老年代。

    • 新生代
      新生代中可以继续分为1个Eden区和2个Survivor区,两者默认按4:1的比例分配内存。新创建的对象会进入Eden区;在一次GC之后,仍然存活的对象从Eden区和第一个Survivor区进入第二个Survivor区;而再次GC,存活的对象从Eden区和第二个Survivor区进入第一个Survivor区。
    • 老年代
      如果一个对象在多次新生代中的GC中(Young GC)仍然存活,则会被复制到老年代。同时若新创建的对象太大(如长字符串或大数组),新生代空间不足,也会直接分配到老年代上(因为大对象容易触发GC,应避免使用生命周期短的大对象)。老年代空间更大,GC次数也会更少。

    栈(Stack)

    我们一般说的栈指的是虚拟机栈,程序会在这块内存中运行,每个方法被执行的时候,都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。而在方法从调用到执行的过程,对应着一个栈帧在虚拟机中从如栈到出栈的过程。因此,栈中保存的是基本类型以及对象的引用。栈的生命期是跟随线程的生命期,线程创建时创建,线程结束栈内存也就释放(栈是线程私有的)。

    *堆与栈的对比

    栈是运行时的单位,堆是存储的单位!
    堆解决数据怎么存、存哪里,栈解决程序如何运行,如何处理数据。堆中存的是对象实体,栈中存的是基本数据类型和堆中对象的引用,一个对象的大小是动态变化的,无法估计;但是在栈中,一个对象引用只对应一个4byte的空间。

    栈也是内存空间的一部分,虽然也能存储数据,但还是将它们分隔开来。主要是因为:

    1. 从软件设计角度分析,栈代表逻辑,堆代表数据,堆栈分离会使处理逻辑更清晰。
    2. 每个线程都有自己的线程栈,当堆栈分离时,不同栈能够共享相同堆内资源,节约内存。
    3. 栈因为运行是需要,比如保存系统运行的上下文,需要地址段的划分,由于栈只能向上增长,因此限制住栈存储内容的能力,而堆是根据需要可以动态增长的,因此栈和堆的拆分,使得堆动态增长成为可能,相应栈只需要记住堆中的一个地址即可。
    4. 契合面向对象思想。对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。

    方法区(Method Area)

    JVM方法区又名永久代,与堆十分类似(其实它就是堆中开辟的另一个部分),储存已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它和堆一样,也是线程共享的,但它是一片连续的堆空间。方法区的垃圾收集和堆中的老年代捆绑在一起,因此无论谁满了,都会触发方法区和老年代的垃圾收集。

    本地方法栈(Native Stack)

    本地方法栈和虚拟机栈十分类似,只是使用方式不同:虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。

    本地方法可以通过JNI(Java Native Interface)来访问虚拟机运行时的数据区,甚至可以调用寄存器,具有和JVM相同的能力和权限(最著名的本地方法应该是System.currentTimeMillis(),JNI使Java深度使用OS的特性功能,复用非Java代码)。在项目过程中,因为本地方法是一方不属于Java的天地,因此我们将其当作了一个黑盒看待。可是我们不知道这个黑盒里藏着的是宝藏还是一枚定时炸弹,所以我们将栈分成了两部分,这样即使本地方法崩溃也不会影响JVM的稳定。

    程序计数器(Program Count Register)

    Register 的命名源于CPU的寄存器,CPU只有把数据装载到寄存器才能够运行。
    寄存器存储指令相关的现场信息,由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。这样必然导致经常中断或恢复,如何保证分毫无差呢?
    每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器用来存放执行指令的偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器。程序计数器在各个线程之间互不影响,此区域也不会发生内存溢出异常。每条线程都有一个独立的程序计数器,因此它是线程私有的,随着线程的创建而创建,随着线程的结束而死亡。

    展开全文
  • JVM:图文详解Java虚拟机的内存结构

    万次阅读 多人点赞 2019-09-29 07:33:11
    本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢
  • 比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存模型,这就是几个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、JAVA内存结构、JAVA内存...
  • JVM内存结构和Java内存模型别再傻傻分不清了

    万次阅读 多人点赞 2020-03-04 20:53:30
    JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多...
  • Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助。由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。 ...
  • Java虚拟机内存结构及编码实战

    万次阅读 多人点赞 2019-12-23 08:48:10
    深度解析了JVM的内存结构,图文并茂,生动形象。并编写多个示例代码,展示了JDK中各个不同的内存结构,详细讲解了不同版本JDK对内存结构实现的区别。
  • 内存篇:JVM内存结构

    万次阅读 2019-11-01 19:50:24
    Java8相对之前的版本,JVM结构发生了较大的变化,取消了永久代,新增了元空间,...JVM内存结构1 JVM结构详解1.1 堆(Heap)1.2 方法区(Method Area)1.3 程序计数器(Program Counter Register)1.4 虚拟机栈(JVM ...
  • JAVA内存结构和JAVA内存模型

    千次阅读 2018-01-18 12:01:43
    JAVA内存结构:堆、栈、方法区; 堆:存放所有 new出来的东西(堆空间是所有线程共享,虚拟机气动的时候建立);栈:存放局部变量(线程创建的时候 被创建);方法区:被虚拟机加载的类信息、常量、静态常量等。 类...
  • ArrayList内存结构

    千次阅读 2019-02-15 15:36:32
    ArrayList内存结构 结论: ArrayList 存放数据的是数组 ArrayList 存放数据的始终是一块连续的内存空间 初始化ArrayList时,在内存中分配一块区域,存放数组 添加元素,如果分配的空间已经用完,就开辟一块大...
  • Java内存结构

    千次阅读 2018-07-31 13:52:26
    Java内存结构:堆、栈、方法区、程序计数器、本地方法栈 java内存的基本结构图: 《深入理解Java虚拟机(第二版)》中的结构图: Java中内存分配: Java程序在运行时,需要在内存中的分配空间。为了提高运算...
  • JVM这块知识绝对是学习java过程中的重点和难点,我习惯把这块的知识叫做javaSE高级基础,在学习jvm这块的知识,你一定会遇到几个概念,那就是java内存结构,java内存模型,java对象模型和jvm内存结构!而这几个概念...
  • jvm内存结构和内存模型

    千次阅读 2019-09-04 17:42:46
    JVM内存结构 《深入理解Java虚拟机(第2版)》中的描述是下面这个样子的: JVM的内存结构大概分为: 堆(Heap):线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 方法区(Method ...
  • Linux内存结构

    千次阅读 2018-12-20 18:58:07
    Linux内存结构 Node 首先, 内存被划分为结点. 每个结点关联到系统中的一个处理器,内核中表示为pg_data_t的 实例. 系统中每个节点被链接到一个以NULL结尾的pgdat_list链表中&amp;lt;而其中的每个节点利用pg_data_...
  • JVM 内存结构

    千次阅读 2018-09-19 20:29:22
    JVM 内存结构 JVM内存划分/运行时数据区 根据线程私有共享来划分jvm内存区 程序计数器(Program Counter Register) 当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个...
  • ORACLE内存结构

    千次阅读 2019-04-06 23:19:16
    为了对ORACLE数据库有一个基本的了解,我们首先需要理解ORACLE的内存结构。           可以大体上将ORALCE内存分为以下几类: System Global a...
  • JVM内存结构概述

    千次阅读 2019-08-20 23:32:58
    本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。 目录 前言 JVM是什么 JVM内存结构概览 运行时...
  • 1.JVM内存结构 上面是概览图,JVM内存结构大致可以分为线程共有和线程私有两部分: 线程私有: 1,程序计数器:用于存放下一条运行的指令,这里是唯一无内存溢出的区域。如果当前程序正在执行一个Java方法,则...
  • JVM内存结构详解

    万次阅读 多人点赞 2020-04-28 12:09:06
    文章目录一、你了解JVM内存模型吗在这之前需要知道JVM内存模型图——JDK1.81.1、程序计数器1.2、Java虚拟机栈(Stack)1.1.1、java.lang.StackOverflowError问题1.3、本地方法栈1.4、元空间(MetaSpace)1.4.1、...
  • JVM 的内存结构和内存分配

    千次阅读 2016-07-14 10:29:46
    JVM 的内存结构和内存分配
  • 走近InnoDB内存结构

    千次阅读 2020-04-06 16:10:47
    文章目录摘要整体结构内存结构Buffer PoolLRUBuffer Pool ListBuffer Pool配置flushChange BufferLog BufferAdaptive Hash Index参考 摘要 本文基于MySQL5.7为基础,讨论InnoDB内存结构的相关内容。其中涉及到Buffer...
  • oracle数据库内存结构

    千次阅读 2018-01-10 08:54:32
    -----------oracle内存结构概述:  oracle 数据库实例由一系列内存结构和后台进程组成。用户操作数据库的过程实质上是与数据库实例建立连接,然后通过实例来操作数据库的过程。 用户的所有操作都在内存中进行,...
  • 原创 | jvm01、JVM内存结构

    千次阅读 2018-09-23 00:38:22
    java内存结构也就是jvm内存结构,我们经常说的是jvm内存结构,包含了堆内存,栈和方法区等内容,是学习jvm必备的知识,所以jvm内存结构这块知识的学习是很重要的! 首先要知道的就是java内存结构等同于jvm内存结构...
  • STM32内存结构总结

    千次阅读 2019-02-11 17:11:14
    STM32内存结构总结 文中引用图片来源与网络 本文由各方面资料整理而成 文章目录STM32内存结构总结0.STM32内存结构图1.要点1.1 两种存储类型: RAM 和 Flash1.2 六类存储数据段: .data/.bss/.text/.constdata/...
  • Mysql之内存结构

    千次阅读 2019-02-13 21:02:38
    内存结构 Mysql内存组成可以分为SGA(系统全局)和PGA(程序缓存区) SGA内存主要构成 参数 用途 innodb_buffer_pool 用来缓存innodb表的数据,索引,插入缓存,数据字典等信息 innodb_log_buffer 即redo ...
  • 1)JVM内存结构; 2)Java内存模型

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,107
精华内容 46,042
关键字:

内存结构