JVM
文章平均质量分 87
JVM
小刘你最强
这个作者很懒,什么都没留下…
展开
-
Java内存模型
Java内存模型简单介绍一下Java内存模型Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域,静态域和数组元素)来完成隐式通信。Java 内存模型(JMM)控制 Java 线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见。JVM主内存与工作内存Jav原创 2021-05-03 22:54:27 · 158 阅读 · 1 评论 -
指针碰撞和空闲列表
对于Java开发来说,在虚拟机内存管理的帮助下,不需要为每个新的对象在代码层面分配内存,回收内存,比如像C语言那样操作。所以在正常情况下,内存泄露和内存溢出等问题也不太容易出现。所以要是运行中的程序出现了内存泄露问题,排查还是有一定困难。Java堆是被所有线程共享的一块内存区域,主要用于存放对象实例,为对象分配内存就是把一块大小确定的内存从堆内存中划分出来,通常有指针碰撞和空闲列表两种实现方式。1.指针碰撞法假设Java堆中内存时完整的,已分配的内存和空闲内存分别在不同的一侧,通过一个指针作为分界点,原创 2021-04-26 17:21:23 · 2311 阅读 · 0 评论 -
Class文件结构
Class文件结构1 概述作为Java程序员,为什么我们需要接触字节码文件?字节码文件的跨平台性Java语言:跨平台的语言(write once, run anywhere)当Java源代码成功编译成字节码后,如果想在不同平台运行,则无需再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的编译器跨平台似乎已经快成为一门语言必选的特性了Java虚拟机:跨语言的平台Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这原创 2021-04-14 22:07:41 · 173 阅读 · 0 评论 -
垃圾回收器
垃圾回收器原创 2021-04-12 21:50:32 · 382 阅读 · 0 评论 -
垃圾回收相关概念
垃圾回收相关概念原创 2021-04-11 17:02:28 · 89 阅读 · 0 评论 -
垃圾回收相关算法
垃圾回收相关算法标记阶段:引用计数算法标记阶段的目的方法区和堆存在GC和OOM程序计数器既没有GC也没有OOM本地方法栈和虚拟机栈没有GC,但是存在StackOverFlow频繁的回收新生代,较少的回收老年代,基本不懂元空间垃圾标记阶段:主要是为了判断对象是否存活在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃原创 2021-04-10 18:30:18 · 140 阅读 · 0 评论 -
垃圾回收概述
垃圾回收概述什么是垃圾?概述Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制原创 2021-04-09 20:09:28 · 111 阅读 · 0 评论 -
StringTable(字符串常量池)
StringTable(字符串常量池)String的基本特性String:字符串,使用一对 “” 引起来表示String s1 = "chinese";// 字面量的定义方式String s2 = new String("hello");// new 对象的方式String被声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义了原创 2021-04-07 15:24:55 · 486 阅读 · 4 评论 -
执行引擎
执行引擎执行引擎概述执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只原创 2021-04-04 19:53:07 · 139 阅读 · 0 评论 -
对象的实例化内存布局与访问定位
对象的实例化内存布局与访问定位对象的实例化对象创建的方式new:最常见的方式、单例类中调用getInstance的静态类方法,XxxxBuilder/XxxFactory的静态方法Class的newInstance方法:反射的方式,在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 publicConstructor的newInstance(Xxxx):反射的方式,反射的方式,可以调用空参的,或者带参的构造器,权限没有要求使用clone():不调用任何的构造器,要求当前原创 2021-04-02 19:17:33 · 168 阅读 · 0 评论 -
方法区
方法区栈、堆、方法区的交互关系运行时数据区结构图从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及线程会话管理。栈、堆、方法区的交互关系下面涉及了对象的访问定位Person 类的 .class 信息存放在方法区中person 变量存放在 Java 栈的局部变量表中真正的 person 对象存放在 Java 堆中在 person 对象中,有个指针指向方法区中的 person 类型数据,表明这个 person 对象是用原创 2021-04-01 17:59:45 · 192 阅读 · 0 评论 -
堆
堆堆的核心概述堆与进程堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。但是进程包含多个线程,他们是共享同一堆空间的。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,堆是JVM管理的最大一块内存空间,并且堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上原创 2021-03-31 19:54:58 · 129 阅读 · 0 评论 -
直接内存
直接内存(Direct Memory)直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区/** * IO原创 2021-03-30 09:58:29 · 83 阅读 · 0 评论 -
本地方法栈
本地方法栈Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小(在内存溢出方面和虚拟机栈相同)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个outofMemoryEr原创 2021-03-30 09:43:06 · 112 阅读 · 0 评论 -
本地方法接口
本地方法接口本地方法简单地讲,一个Native Method是一个Java调用非Java代码的接囗一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern 告知C++编译器去调用一个C的函数。“A native method is a Java method whose implementation is provided by non-java code.”(本原创 2021-03-29 18:14:24 · 120 阅读 · 0 评论 -
虚拟机栈
虚拟机栈虚拟机栈的概述虚拟机栈的出现背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的栈与堆有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?原创 2021-03-28 17:49:29 · 87 阅读 · 0 评论 -
程序计数器
程序计数器(PC寄存器)PC Register介绍官方文档网址:https://docs.oracle.com/javase/specs/jvms/se8/html/index.htmlJVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。一个线程对应一个 JVM Stack。JVM Stack 中包含一组 Stack Frame。当 JVM 调用一原创 2021-03-25 19:34:22 · 248 阅读 · 0 评论 -
运行时数据区概述及线程
运行时数据区概述及线程前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区类比一下也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,厨师开始使用运行时数据区,根据字节码指令依次执行,将它翻译为机器指令,让CPU解释运行,原创 2021-03-19 12:22:06 · 94 阅读 · 0 评论 -
类加载子系统
类加载子系统内存结构概述LV:局部变量表,本地变量表OS:操作数栈DL:动态链接RA:方法返回地址注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎类加载器与类的加载过程类加载子系统的作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution E原创 2021-03-17 15:59:53 · 114 阅读 · 0 评论 -
JVM与Java体系结构
Java和JVM简介你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOM(内存溢出)!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了。每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC、OOM等问题,一脸懵逼。Java vs C++Java生态圈Java是目前应用最为广泛的软件平台之一。随着Java以及Java社区的不断壮原创 2021-03-17 09:29:34 · 190 阅读 · 0 评论