JVM之内存结构详解

JVM内存结构

java虚拟机在执行程序的过程中会将内存划分为不同的区域,具体如图1-1所示.

五个区域

JVM分为五个区域:堆、虚拟机栈、本地方法栈、方法区(元空间)、程序计数器

PS: 1.五个区域中,虚拟机栈、本地方法栈、程序计数器为线程私有、方法区和堆为线程共享区; 2.JVM中不同区域的占用大小不同,堆最大,程序计数器最小,Java中最多的“对象”就是放在堆中

堆得主要作用就是存储对象,它占用最大的内存空间堆区,也同样成为了java垃圾收集器的重要对象。因此也被称为“GC堆”。堆是jvm所有线程共有的。

图1-1-1

由于垃圾收集器GC采用分代收集算法,所以堆内存中也分成了 2/3年轻代,1/3老年代 。如图1-1-1所示。

关于JAVA垃圾收集器GC分代的概念:

JVM 内置的通用垃圾回收原则,堆内存划分为 Eden、Survivor 和 Tenured/Old 空间bai。GC一共分三种:MinorGC,Major GC v和Full GC。Full GC是清理整个堆空间—包括年轻代和永久代。有时候系统会频繁的FullGC,这时候需要去服务器查一下原因。

新生成的对象首先放到年轻代Eden区,当Eden空间满了,触发Minor GC,存活下来的对象移动到Survivor0区,Survivor0区满后触发执行Minor GC,Survivor0区存活对象移动到Suvivor1区,这样保证了一段时间内总有一个survivor区为空。经过多次Minor GC仍然存活的对象移动到老年代。老年代存储长期存活的对象,占满时会触发Major GC=Full GC,GC期间会停止所有线程等待GC完成,所以对响应要求高的应用尽量减少发生Major GC,避免响应超时。 Minor GC : 清理年轻代 Major GC : 清理老年代 Full GC : 清理整个堆空间,包括年轻代和永久代 所有GC都会停止应用所有线程。

关于新生代到老年代的规则:

如图1-1-2所示:

1.minorgc回收整个年轻带,挪一次分代年龄+1,长期存活的对象分代年龄达到15到老年代。或者survior满了会触发minorGC会自动到达老年代。

2.一批对象如果大于surviovr区域百分之五十直接进入老年代

3.为了避免大对象分分配内存是需要复制大对象会直接进入老年代

图1-1-2

JVMGC内部采用可达性分析算法回收对象,具体规则如图1-1-3所示,可达性算法是将“GC Roots”作为起点,搜索引用的对象,搜索到的对象打上标记。未搜索的标记为非垃圾对象。

图1-1-3

Java虚拟机栈

虚拟机栈中存储的是方法,栈中的数据都是以栈帧的格式存在,我们简称栈帧,栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。java虚拟机栈是线程私有的,它的生命周期是和线程一样。每个线程在创建的时候都会创建一个虚拟机栈。但是而在栈帧中分为操作数栈,局部变量,动态链接,返回地址等。

ps:1.每一个栈帧遵循先进后出后进先出的出栈入栈规则。

2.操作数栈:从局部变量中或者对象实例中复制常量或者变量到操作数栈,在随着计算将栈中元素出栈到局部变量或者返给方法调用者。通俗来说,就是传递参数的。

3.动态链接,每一个栈帧都会有一个指向运行时常量池(运行时常量池是在JVm在运行加载类的时候,把class文件里的常量放到运行时常量里。一个类对应一个运行时常量池)的引用,来支持方法与方法之间的调用。字节码中的方法调用指令就以常量池中方法的符号引用为参数。

4.局部变量中的对象指针指向堆

本地方法栈

首先,什么是本地方法呢?JVM中的本地方法是指java带有修饰符native的方法,但是方法体不是用java写的。这一类方法被称为java本地方法。这类方法的存在的意义是为了弥补java代码不方便实现的缺陷而提出的。

本地方法栈,作用与java虚拟机栈类似。 区别是:虚拟机栈为虚拟机执行java方法服务,而本地方法是为native方法服务。

本地方法栈是线程私有的。它的生命周期与线程相同,每个线程只有一个。

方法区(元空间)

1.线程共享。在虚拟机启动时候创建,所有jvm线程共享。

2.上文所提到的运行时常量池就是方法区的一部分。

3.被装载的class文件的信息存储在方法区中的运行时常量池中,他使用类装载器定义相应的class文件

4.用于存在已被虚拟机加载的类信息,常量,变量,静态变量

程序员写的代码其实在在jvm虚拟机中被转成了一条条指令集执行的。如下图。

图5-1

程序计数器

程序计数器也叫PC寄存器,是一块内存空间,如果将class文件进行反编译后,就能看到一条条的指令集,如图5-1动图所示,PC代表的就是程序计数器的计数。

他可以看作是线程所执行的字节码的行号指示器,在虚拟机中,字节码解释器工作时,就是根据程序计数器的值来选取下一条需要执行的指令。分支、循环、异常处理、跳转都是需要这个程序计数器来完成。当虚拟机正在执行一个本地方法也就是native方法时,程序计数器存储的值是undefined。程序计数器是私有的。它的生命周期与线程相同,每个线程都有一个。

JAVA程序执行顺序:

1.加载主方法的class文件进入方法区,方法区加载类的信息。

2.执行程序后,方法区的方法入栈,栈给方法分配栈帧。

3.遇到new对象的情况就在堆中开辟这个类的实例空间

arthas:查看cpu,jvm调优工具

JVMGC垃圾收集器:在底层执行的时候,会停掉所有线程(stop the world 简称STW),尽量的减少full gc.

面试:1.为什么要设计STW?

      2.能否对jVM调优,让其几乎不发生Full  Gc

一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程的更多相关文章

  1. PowerShell攻防进阶篇:nishang工具用法详解

    PowerShell攻防进阶篇:nishang工具用法详解 导语:nishang,PowerShell下并肩Empire,Powersploit的神器. 开始之前,先放出个下载地址! 下载地址:htt ...

  2. 精讲RestTemplate第4篇-POST请求方法使用详解

    本文是精讲RestTemplate第4篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  3. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  4. JVM内存详解-阅读笔记

  5. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  6. JVM结构详解

    JVM 结构详解 JVM 结构图 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址.若当前线程正在执行的是一个本地方法,那么此时程 ...

  7. 框架基础学习之--详解web+maven+spring+mybatis+struts框架文件夹作用

    详解web+maven+spring+mybatis+struts框架文件夹作用 1.程序名 2.Mybatis,mybatis是数据持久层,就是和对象类有关系的东西 3.存放java文件,xml,p ...

  8. 想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例

    Java 设计模式   设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结 设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类.分别是创建型模式.结构型模式和行为型模式 列举几种设 ...

  9. 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解

    今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...

随机推荐

  1. RuntimeError already started

    Env: os: Ubuntu python3 pytorch vscode Desc 在上述环境中运行A3C多进程模型,使用命令行时没问题,使用vscode时出现 'RuntimeError: al ...

  2. C++中main函数的返回值一定要是int

    因为大学上课时候,经常是在主函数中做处理,直接用cout语句输出到显示设备,所以一直在用void main(). 直到后面具体编程的时候,才发现void main()这种用法是按 C89(C语言的早期 ...

  3. spring-cloud-netflix-eureka-server

    一.构建springcloud父pom工程,管理版本 pom.xml <?xml version="1.0" encoding="UTF-8"?> ...

  4. Asp.Net Core Grpc 入门实践

    Grpc简介 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. 在 gRPC 中,客户端应用程序可以直接调用不同计算机上的服务器应用程序上的方法,就像它是本地对象一样,从而更轻松地创 ...

  5. tfrecords转图片存储

    import os import shutil import tensorflow as tf import time import sys import cv2 # 图片存放位置 PATH_RES ...

  6. Adaptive Threshold

    Adaptive Threshold 1. Otsu's Binarization: Using a discriminant analysis to partition the image into ...

  7. The Weekly Web Dev Challenge: String Calculator

    The Weekly Web Dev Challenge: String Calculator https://twitter.com/intent/tweet?text=I just complet ...

  8. egg.js 如何禁用 sensors data

    egg.js 如何禁用 sensors data holy shit http://localhost:7001/product/create const json = {"id" ...

  9. Flutter ColorFiltered 将ColorFilter应用于其子级。

    ColorFiltered ColorFilter BlendMode Example <summary>main.dart</summary> import 'package ...

  10. 瞧一瞧React Fiber

    啥是React Fiber? React Fiber,简单来说就是一个从React v16开始引入的新协调引擎,用来实现Virtual DOM的增量渲染. 说人话:就是一种能让React视图更新过程变 ...