
JVM底层原理
fFee-ops
it's tough.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM各区存放的东西~
JVM各区存放的东西~原创 2021-06-17 23:10:09 · 381 阅读 · 0 评论 -
栈的相关面试题
栈的相关面试题①举例栈溢出的情况?( StackOverflowError)比如一个栈是大小是固定了的,当你调用的方法太多,超出了大小限制则会造成StackOverflowError。还有就是栈的大小可以动态改变,用-Xss改变栈的大小,当尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个outOfMemoryError异常。②调整栈大小,就能保证不出现溢出吗?不能,如果是死循环,不管栈的大小是多少都会出现溢出③分配的栈内存越原创 2020-11-12 20:47:51 · 339 阅读 · 0 评论 -
GC日志分析
GC日志分析打开GC日志:一些补充说明打开GC日志:①-verbose:gc②-verbose:gc -XX:+PrintGCDetails③如果想把GC日志存到文件,使用:-Xloggc:/path/to/gc.log一些补充说明原创 2020-09-30 10:15:58 · 318 阅读 · 0 评论 -
垃圾回收器
垃圾回收器GC分类与性能指标GC分类与性能指标按线程数:可以分为串行与并行垃圾回收器原创 2020-09-28 14:54:30 · 239 阅读 · 0 评论 -
垃圾回收相关概念
垃圾回收相关概念System.gc()的理解内存溢出与内存泄漏内存溢出OOM内存泄漏Memory LeakStop The World垃圾回收的并行与并发安全点与安全区域安全点安全区域再谈引用强引用(strong reference)--不回收System.gc()的理解在默认情况下,通过 System.gc()或者 Runtime. getRuntime().gc()的调用,会显式触发Full Gc,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。但是System.gc()调用附带一个原创 2020-09-28 13:33:47 · 249 阅读 · 0 评论 -
垃圾回收相关算法
垃圾回收相关算法垃圾标记阶段的算法之引用计数算法小结垃圾标记阶段的算法之可达性分析算法对象的finalization机制垃圾清除阶段算法之标记--清除算法垃圾清除阶段算法之复制算法垃圾标记阶段的算法之引用计数算法在执行GC前要先判断那些是存活对象,哪些是已经死亡的对象。只有被标记为已死亡的对象,GC的时候才会把它收拾掉。判断对象是否存活一般有两种方式:引用计数算法(Java并不使用)、可达性分析算法/** * -XX:+PrintGCDetails * 证明:java使用的不是引用计数算法原创 2020-09-25 22:34:20 · 198 阅读 · 0 评论 -
垃圾回收概述
垃圾回收概述什么是垃圾为什么要GCJava的垃圾回收机制什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。为什么要GC对于高级语言来说,如果不进行垃圾回收,内存迟早都会被消耗完因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配绐新的对象随着应用程序所应付的业务越来越庞大、复杂,没有GC就不能保证应用程序的正常进行原创 2020-09-25 20:20:55 · 362 阅读 · 0 评论 -
StringTable
StringTableString的基本特性String的内存分配String基本操作字符串拼接操作intern()的使用intern()的空间效率测试String Table的垃圾回收G1中的 String去重操作总结new String()创建了几个对象?关于intern()的练习题注意!!!!在执行完以下代码后,字符串常量池中不会出现对象"11" String s3 = new String("1") + new String("1");String的基本特性string声明为final的原创 2020-09-24 22:44:23 · 232 阅读 · 0 评论 -
执行引擎
执行引擎概述Java代码编译和执行的过程解释器与JIT(just in time)编译器为什么说JAVA是半编译半解释型语言?机器码、指令、汇编语言字节码解释器JIT编译器有了JIT为什么还要保留解释器JIT的概念解释什么时候启动JIT编译器热点代码及探测方式方法调用计数器回边计数器Hotspot VM中JIT分类概述执行引擎是Java虚拟机核心的组成部分之一“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上原创 2020-09-23 10:35:31 · 340 阅读 · 0 评论 -
直接内存
直接内存直接内存是在JAVA堆外,直接向系统申请的内存区间。来源于NIO,通过存在堆中的 DirectByteBuffer操作 Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。缺点分配回收成本较高不受JVM内存回收管理直接内存原创 2020-09-21 22:36:18 · 155 阅读 · 0 评论 -
对象的实例化、内存布局与访问定位
对象的实例化、内存布局与访问定位对象的实例化对于上图中“创建对象的步骤”详细的解释对象的内存布局对象的访问定位JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的对象的实例化对于上图中“创建对象的步骤”详细的解释1、判断对象的类是否加载,链接,初始化2、为对象分配内存:如果内存规整:指针碰撞如果不规整:空闲列表说明5、设置对象的对象头6、执行init方法进行初始化对象的内存布局对象的访问定位JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的1原创 2020-09-21 15:12:07 · 194 阅读 · 0 评论 -
方法区(下)
方法区(下)方法区使用举例方法区的演进细节永久代为什么要被元空间取代String Table为什么要调整方法区的垃圾收集总结方法区使用举例public class MethodAreaDemo { public static void main(String[] args){ int x=500: int y 100: int a =x/y; int b=50 System. out. println(a b) }}详情过程见该处方法区的演进细节首先要明确的一个点,只有Hotsp原创 2020-09-20 21:31:26 · 319 阅读 · 0 评论 -
方法区(上)
方法区(上)栈、堆、方法区的交互关系方法区的理解元空间和永久代的区别设置方法区大小与OOM设置方法区大小如何解决OOM方法区的内部结构存储的东西常量池和运行时常量池为什么需要常量池?运行时常量池栈、堆、方法区的交互关系new出来的那个 new XX都是存放在堆中。Person这个类则被存放到方法区中person这个对象则放在栈中。方法区的理解方法区看作是一块独立于堆的内存空间方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:原创 2020-09-20 11:41:14 · 291 阅读 · 0 评论 -
堆是分配对象存储的唯一选择吗?
????逃逸分析举例参数设置逃逸分析之代码优化栈上分配同步省略分离对象/标量替换逃逸分析小结在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有种特殊情况,那就是如果经过逃逸分析( Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这是最常见的堆外存储技术。逃逸分析判断是否会将堆上的对象分配到栈上去就需要逃逸分析。逃逸分析基本概念当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。当一个对象在方法中被原创 2020-09-19 10:59:25 · 268 阅读 · 0 评论 -
堆(下)
堆(下)Minor GC、Major GC与Full GCMinor GC、Major GC与Full GC在 Hotspot VM的实现中,它里面的GC按照回收区域分为两大种类型:一种是部分收集(Partial GC)一种是整堆收集(Full GC)部分收集: 不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集( Minor gc/ Young GC):只是新生代的垃圾收集老年代收集( Major GC/oldGC):只是老年代的垃圾收集目前,只有 CMS GC会有单独收集原创 2020-09-18 09:12:52 · 194 阅读 · 0 评论 -
堆(上)
堆(上)堆的核心概述堆空间细分设置堆内存大小与OOM年轻代与老年代堆中各个区所占的比例图解对象分配过程观察堆内存空间变化的工具基本步骤示例讲解过程总结堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。(堆内存的大小是可以调节的)所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(在新生代的伊甸园区里面每个线程划分的有私有缓冲区)方法结束以后堆中的对象不会原创 2020-09-17 21:00:46 · 290 阅读 · 0 评论 -
本地方法栈
本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。本地方法是使用C语言实现的。它的具体做法是 Native Method stack中登记 native方法,在Execution Engine执行时加载本地方法库。对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的原创 2020-09-17 09:09:29 · 518 阅读 · 0 评论 -
本地方法接口
本地方法接口什么是本地方法为什么要使用Native Method什么是本地方法native method就是一个JAVA调用非JAVA代码的接口。一个本地方法是一个Java方法:该方法的实现由非Java语言实现,比如C。在定义一个 native method时,并不提供实现体(有些像定义一个Javainterface),因为其实现体是由非java语言在外面实现的。但是要搞清楚,native method 是有实现体的,只不过是在外部实现的标识符 native可以与所有其它的java标识符连用原创 2020-09-17 08:59:56 · 369 阅读 · 0 评论 -
虚拟机栈(下)
虚拟机栈(下)栈顶缓存技术动态链接(指向运行时常量池的方法引用)运行时常量池方法的调用静态链接动态链接方法的绑定机制早期绑定晚期绑定虚方法与非虚方法关于invokedynamic指令虚方法表方法返回地址栈帧中的一些附加信息栈顶缓存技术什么是栈顶缓存技术将栈顶元素在物理CPU的寄存器中,以此降低对内存的读/写次数,提升执行引擎的执行效率。为什么需要栈顶缓存技术因为操作数是存储在内存中的,所以频繁的读写会对内存造成很大的负荷进而影响执行速度。动态链接(指向运行时常量池的方法引用)每个栈帧都对应着一原创 2020-09-15 23:39:24 · 226 阅读 · 0 评论 -
虚拟机栈(上)
虚拟机栈虚拟机栈的概述内存中的堆与栈虚拟机栈基本内容面试题:开发中遇到的异常有哪些?设置栈内存大小栈的存储单位栈中都存储什么?栈运行原理虚拟机栈的概述虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。其优点是跨平台,指令集小,编译器容易实现。缺点是性能下降,实现同样的功能需要更多的指令。内存中的堆与栈栈是运行时的单位,而堆是存储的单位即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问原创 2020-09-13 22:57:11 · 235 阅读 · 1 评论 -
程序计数器(PC寄存器)
程序计数器(PC寄存器)PC Register介绍举例说明三个常见的问题PC Register介绍JVM中的程序计数寄存器( Program Counter Register)中, Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行.这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽原创 2020-09-13 12:37:54 · 2767 阅读 · 0 评论 -
运行时数据区概述及线程
运行时数据区概述及线程概述线程概述内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。灰色的为单独线程私有的,红色的为多个线程共享的。即:每个线程:独立包括程序计数器、栈、本地栈。线程间共享:堆、堆外内存(永久代或元空间、代码缓存线程原创 2020-09-13 11:28:22 · 200 阅读 · 0 评论 -
类加载子系统
类加载子系统类加载器与类的加载过程类加载器ClassLoader角色类加载器过程类加载器与类的加载过程类加载子系统的作用类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文开头有特定的文件标识。JAVA专属字节码文件开头都是CA FE BA BEClassloade只负责class文件的加载,至于它是否可以运行,则由 ExecutionEngine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包原创 2020-09-10 23:16:39 · 327 阅读 · 0 评论 -
JVM简介
JVM简介java跨平台的语言Java代码执行流程JVM跨语言的平台字节码虚拟机与java虚拟机虚拟机java虚拟机JVM的位置JVM的整体结构JVM架构模型JVM的生命周期java跨平台的语言Java代码执行流程JVM跨语言的平台Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心 “字节码” 文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助原创 2020-09-10 09:59:12 · 279 阅读 · 0 评论