精华内容
下载资源
问答
  • JVM内存模型

    2018-12-02 15:38:29
    JVM 内存模型整理
  • JVM内存模型详解

    2019-02-22 14:48:33
    jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。
  • 通俗的来讲,jvm主要分为5个部分 程序计数器、虚拟机枝、本地方法枝、 Java 堆、 方法区, 引用大佬总结的概括程序计数器用于存放下一条运行的指令,虚拟机栈和本地方法栈用于存放函数调用堆栈信息, Java 堆用于...
  • JVM: 结合一个例子理解JVM内存模型原理-附件资源
  • jvm 内存模型

    2019-01-12 17:17:33
    昨天一个面试,问到jvm的内存模型,老子准备了类加载,多线程,你一个都不问,问老子jvm内存模型,我上次面试记得这次面试早忘光了,我可能真正要解决的还是记忆力、理解力和表达能力的问题。还有就是把我做的项目吹...

           昨天一个面试,问到jvm的内存模型,老子准备了类加载,多线程,你一个都不问,问老子jvm内存模型,我上次面试记得这次面试早忘光了,我可能真正要解决的还是记忆力、理解力和表达能力的问题。还有就是把我做的项目吹的更牛逼一点。

         还问了一个利用redis排序的问题,麻蛋,redis就是个数据库,能排个鸡毛序啊(查了一下,原来是用redis的sort命令)。

         还问了一个linux 命令后加&符号是干嘛用的,我就记得是后台执行的,nohup 执行在session断掉后程序也随之停止,加上&之后,session断掉程序依旧执行。

          昨天只记得jvm有个堆内存和栈内存。堆内存用来存放实体对象,栈用来存放线程,方法指针。什么新生代,老生代,这些都是jvm内部的事情,了解了顶多对运行参数进行个优化,真不知道这玩意有什么好问的。

         刚才看了一篇文章,现在总结一下,文章出处:https://www.cnblogs.com/dingyingsi/p/3760447.html

         1、计算机的运行模型 。cpu-高速缓存--主内存, 计算机内部有怎么的高速缓存与主存一致性的算法。 对应到jvm虚拟机中,就是主存---线程内工作内存---线程。这基本上就涉及到了多线程的问题,再次不多说。这个是java的内存模型如下图:

    2、  jvm 的内存模型如下图:

    3、jvm的内存模型包括 程序计数器,java虚拟机栈,java虚拟机堆,本地方法栈,方法区。

         程序计数器: 指示当前线程中正在运行的字节码行数。

         java虚拟机栈: 局部变量表,操作数栈,动态链接,方法出口。一个线程方法执行,就是从入栈到出栈的过程。局部变量表存放数据的基本类型,对象引用类型和returnaddress(下一条指令地址)。局部变量表的空间是确定的。

        本地方法栈: 是对本地方法的引用栈。

        java堆:对象实例的内存区域。所有的对象实例以及数组都要在堆上分配。

       补充一个:https://blog.csdn.net/qq_41701956/article/details/81664921 。 看的发困,改天再看吧。

     

      

     

    展开全文
  • jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,
  • jvm内存模型和java内存模型

    千次阅读 多人点赞 2018-12-03 21:46:29
    初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。...直至今天,我看了java线程通讯之java内存模型,出现了主内存、...

    初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、工作内存等相关的字眼,说什么工作内存从主内存拷贝一份共享变量做高速缓存,每个线程拥有一个工作内存,这什么内存模型,又解决了什么问题呢。甚是不解,搜索了半天。原来一开始我们就搞混乱了。我们之前说的栈堆那个是JVM内存模型啊。

    区别:JVM内存模型则是指JVM的内存分区,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。

    我们可以看到,Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。那么java虚拟机从底层就怎么操作的呢。

    JMM并不像JVM内存结构一样是真实存在的,只是一个抽象的概念。JMM是和多线程相关的,描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。所以,我理解的就是JMM就是为了解决Java多线程对共享数据的读写一致性问题而产生的一种模型!

     

    下图是反映了主内存与线程工作内存(即是本地内存)之间的关系:

    JMM的主要目标是实现在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与Java编程里面的变量有所不同步,它包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共享,当然不存在数据竞争问题。所以,我理解的是上图中的共享变量只是堆中的部分变量。而JMM规定了所有的变量都存储在主内存中,这个变量我想都是堆变量,如果硬是要跟JVM做一下匹配,那么我想主内存就相当于堆内存和方法区。然后线程copy的共享变量只是对部分堆变量的copy。那么,可想而知,如果硬是要匹配,我想工作内存里是包含两部分:线程私有的栈(这里不共享,也就没啥事),对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓冲区)。

    看张图就清晰了,

    每个线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。

    分析上图:

    1.线程A把从工作内存更新过的共享变量刷新到主内存中去。

    2.线程B到主内存中去读取线程A刷新过的共享变量,然后copy一份到自己的工作内存里去。

    虽然是这样,并没有解决并发问题啊,不可见?不具备原子性。这时候JMM定义了一些语法集,就是volatile、synchronized啦。

    例如可见性吧,一个线程对共享变量做了修改之后,其他的线程立即能够看到该变量这种变化。Java内存模型是对共享变量进行volatile修饰,然后一个线程通过将在工作内存中的变量修改后的值同步到主内存,另一个线程会立马会看到变化,然后从主内存刷新最新值到工作内存中,这种依赖主内存的方式来实现可见性的。

     

    总之,JVM内存模型是真的内存结构管理,Java内存模型只是为了适应和解决多线程通信而产生的一种模型,通过一些关键字修饰就可以实现并发。

     

    展开全文
  • JVM内存模型和结构

    千次阅读 2020-04-26 10:41:18
    1.JVM内存模型和结构 2.GC原理,性能调优 3.调优:Thread Dump, 分析内存结构 4.class 二进制字节码结构, class loader 体系 , class加载过程 , 实例创建过程 5.方法执行过程 6.Java...

    JVM简介:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。

    JVM内存模型结构图::: 

    1.JVM内存模型和结构

       (1)JVM内存模型如下:::

                         Young(年轻代)=  New

                         Tenured(老年代)=  Old

                          Perm(永久代) = Perm

    Young(年轻代)可以分为Eden区和两个Survivor区(from和to,这两个Survivor区大小严格一致),新的对象实例总是首先放在Eden区,Survivor区作为Eden区和 Tenure(终生代)的缓冲,可以向Tenure(终生代)转移活动的对象实例。 

    Tenure(终生代)中存放生命周期长久的实例对象,但并不是如它的名字那样是终生的,里面的对象照样会被回收掉。

    Young和Tenure共同组成了堆内存(默认新生代与老年代的空间大小为1:2)。

    Perm(永久代)则是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等

          JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。

          在JVM启动时,就已经保留了固定的内存空间给Heap内存,这部分内存并不一定都会被JVM使用,但是可以确定的是这部分保留的内存不会被其他进程使用。这部分内存大小由 -Xmx参数指定。而另一部分内存在JVM启动时就分配给JVM,作为JVM的初始Heap内存使用。影响这个的参数是 -Xms ,如果 -Xms 指定的值比-Xmx 的小,那么两者的差值就是Virtual内存值。随着程序的运行,Eden区、 Tenured区和Perm区会逐渐使用保留的Virtual空间。堆内存默认值最大不会超过1G。

           绝大部分对象在Eden区生成,当Eden区装填满的时候,会触发Young GC。垃圾回收的时候,在Eden区实现清除策略,没有被引用的对象则直接回收,依然存活的对象会被移送到Survivor区。Survivor 区分为S0和S1两块内存空间,送到哪块空间呢?每次Young GC的时候,将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果Young GC要移送的对象大于Survivor区容量上限,则直接移交给老年代。每个对象都有一个计数器,每次YGC都会加1。参数能配置计数器能控制移交次数,默认值是15,意思就是在Survivor 区交换14次之后,晋升至老年代。Survivor 区处理超过上限,老年代也承受时,则会触发Full Garbage Collection(Full GC);如果依然无法放下,则抛OutOfMemoryError,堆出现OOM的概率是所有内存耗尽异常中最高的。所以给JVM设置运行参数-XX:+HeapDumpOnOutOfMemoryError,让JVM遇到OOM异常时能输出堆内信息。

          整个Java虚拟机只有一个堆,所有的线程都访问同一个堆。它是被所有线程共享的一块内存区域,在虚拟机启动时创建,而程序计数器、Java虚拟机栈、本地方法栈都是一个线程对应一个。堆是垃圾回收的主要区域,所以也被称为GC堆,堆的大小既可以固定也可以扩展,但主流的虚拟机堆的大小是可扩展的(通过-Xmx和-Xms控制),因此当线程请求分配内存,但堆已满,且内存已满无法再扩展时,就抛出OutOfMemoryError。

           所以开发工具(IDEA、Eclipse等)一般安装完去修改内存,去提升性能。

                 -Xms是设置java虚拟机的最小分配内存;-Xmx则是最大分配内存;512m为内存空间

                一般-Xmx设置为你电脑物理内存的1/4,而把-Xms和 -Xmx设置为一样,

                一般用到最多的就是 -Xms512m -Xmx512m

    内存参数如图:

    • -Xms设置堆的最小空间大小。
    • -Xmx设置堆的最大空间大小。
    • -XX:NewSize设置新生代最小空间大小。
    • -XX:MaxNewSize设置新生代最大空间大小。
    • -XX:PermSize设置永久代最小空间大小。
    • -XX:MaxPermSize设置永久代最大空间大小。
    • -Xss设置每个线程的堆栈大小
       

    (2)JVM内存结构包含:堆、栈、方法区 

       

        堆:Heap堆是OutOfMemoryError(内存用完了:原因-内存泄漏或内存溢出)故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用。通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象,也容易消耗完所有的空间。堆的内存空间既可以固定大小,也可运行时动态地调整,通过如下参数设定初始值和最大值,比如-Xms512M. -Xmx512M。

               堆分成两大块:新生代和老年代
               对象产生之初在新生代,步入暮年时进入老年代,但是老年代也接纳在新生代无法容纳的超大对象

    JVM运行机制图:

          JDK1.6之前,eclipse对于sun公司的标识能够识别出来,会自动添加对于JVM老年代的容量大小限制: -XX: MaxPermSize=256M; 因为,其他的虚拟机没有hotspot的永久代的概念。 而JDK1.6的时候,sun已经被Oracle收购,替换了jdk中sun的标识,所以,eclipse无法识别出此虚拟机是hotspot的JVM。所以,不会自动给HotSpot设置永久代的内存容量大小。 JVM容易出现持久代一直增长,而导致内存的溢出。

    展开全文
  • JAVA内存模型与JVM内存模型的区别

    千次阅读 2021-01-25 22:39:23
    JVM内存模型: 线程私有区域 程序计数器:是当前线程所执行的字节码的行号指示器,无OOM 虚拟机栈:是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、...

    JAVA内存模型:

    Java内存模型规定所有的变量都是存在主存中,每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行,不能直接堆主存进行操作,并且每个线程不能访问其他线程的工作内存。

    Java内存模型的Volatile关键字,原子性、可见性、有序性

     

    JVM内存模型:

    线程私有区域

    程序计数器:是当前线程所执行的字节码的行号指示器,无OOM

    虚拟机栈:是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

    • 栈帧( Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接

    (Dynamic Linking)、 方法返回值和异常分派( Dispatch Exception)。栈帧随着方法调用而创

    建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异

    常)都算作方法结束。

    本地方法栈:和 Java Stack 作用类似, 区别是虚拟机栈为执行 Java 方法服务, 而本地方法栈则为

    Native 方法服务, 如果一个 VM 实现使用 C-linkage 模型来支持 Native 调用, 那么该栈将会是一个

    C 栈,但 HotSpot VM 直接就把本地方法栈和虚拟机栈合二为一。

     

    线程共享区域

    堆-------运行时数据区:==是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。由于现代 VM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代

    方法区/永久代(1.8之后元空间):用于存储被 JVM 加载的类信息**、常量静态变量、**即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展至方法区, 即使用Java堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存, 而不必为方法区开发专门的内存管理器(永久带的内存回收的主要目标是针对常量池的回收和类型的卸载, 因此收益一般很小)。

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

    展开全文
  • 深入详解JVM内存模型与JVM参数详细配置,感兴趣的小伙伴们可以一块学习下。
  • JVM内存模型和JAVA内存模型的区别

    千次阅读 2019-10-11 22:56:00
    很多人都以为JAVA内存模型就是JVM内存模式,其实二者是不同的概念,本文针对此,主要讲解JVM内存模型和JAVA内存模型的区别。 正文 其实本身二者就是不同的概念,在此我分开来讲。 JVM内存模型 JVM内存模式主要分为:...
  • JVM 内存模型

    热门讨论 2021-05-18 22:54:00
    1 什么是 JVM 内存模型 JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内 存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。 2 JVM 为什么进行内存区域划分 ...
  • 关于JVM内存模型的理解

    万次阅读 多人点赞 2018-03-09 23:47:16
    1、JVM内存模型 首先老规矩,祭上一张自己画的内存模型图 画的比较简陋,简单介绍一下,整个JVM占用的内存可分为两个大区,分别是线程共享区和线程私有区,线程共享区和JVM同生共死,所有线程均可访问此区域;而...
  • 主要介绍了Java内存模型JVM运行时数据区的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • jdk1.8 JVM内存模型

    千次阅读 2020-03-01 00:28:00
    Hotspot虚拟机 jdk1.7 JVM内存模型是这样的 jdk1.8 做出了些改变 做出的改变有: jdk1.8取消了永久代,在jdk1.7及之前的Hostspot虚拟机永久代实现了方法,取而代之的是元空间(Metaspace),补充一点:方法区只是...
  • JVM内存模型(通俗易懂)

    万次阅读 多人点赞 2020-10-30 18:14:32
    1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。...
  • JVM初探 -JVM内存模型

    万次阅读 多人点赞 2016-12-02 18:47:48
    JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时间研读了几本评价较高的JVM入门书籍, 算是总结于此. 本系列博客的...
  • JVM内存模型 如下图所示: 线程私有: 程序计数器: 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器...
  • jdk1.8的jvm内存模型最新总结

    千次阅读 2020-04-05 21:45:07
    因为马上要准备实习面试了,而jvm又是面试常考的,我现在来总结一下jvm相关知识,而对于不同版本的jdk,...1.java内存模型 2.常见gc算法 3.何时进行gc 4.强引用,虚引用等(链接博客算了。。。) 一.java内存模型...
  • 实例浅析JVM内存模型和对象引用

    千次阅读 2018-06-28 11:08:13
    JVM内存模型有以下的设定: 1,有一块内存空间当做主存,叫做堆内存。 2,线程各自有各自的本地内存,叫线程栈,也叫调用栈。 3,线程栈里包含了当前线程执行的方法调用相关信息,还有当前方法的本地变量信息。...
  • jvm详细内存模型图1

    2018-09-03 20:35:25
    查看《深入理解Java虚拟机》后,自己简单总结的jvm相关的简单模型图。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,611
精华内容 59,844
关键字:

jvm内存模型