虚拟机
文章平均质量分 65
soliderzzz
沉迷学习,不能自拔,strategic FooYou Agent
展开
-
JVM内存
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器虚拟机栈区:也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和returnAddress,在编译期间完成分配。堆区,JAVA堆,也称GC堆,所有线程共享,存放对象的实例和数组,JAVA堆是垃圾收集器管理的主要区域。方法区:所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等...原创 2018-06-20 21:58:02 · 224 阅读 · 0 评论 -
垃圾回收机制
static String str0="0123456789";static String str1="0123456789";String str2=str1.substring(5);String str3=new String(str2);String str4=new String(str3.toCharArray());str0=null;假定str0,...,str4后序代码都是只读引...原创 2018-06-11 16:52:26 · 178 阅读 · 0 评论 -
jvm方法区
栈、堆、方法区的交互关系9.1_1从线程共享与否的角度来看9.1_29.1_3.png9.1_42 方法区的理解2.1 方法区在哪里?《Java 虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或进行压缩。”但对于 HotSpot JVM 而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是要和堆分开。所以,方法区看作是一块独立于 Java 堆的内存空间。9.2.1_12.2 方法区的基本理解方法区(转载 2021-11-20 18:10:39 · 290 阅读 · 0 评论 -
jvm_堆
1 堆的核心概述一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。Java 堆区在 JVM 启动时即被创建,其空间大小也就确定了。是 JVM 管理的最大一块空间。堆内存的大小是可以调节的。《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。《Java 虚拟机规范》中对 Java 堆的描述是:所转载 2021-11-20 18:03:33 · 216 阅读 · 0 评论 -
本地方法栈
Java 虚拟机栈用于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新线程时没有足够的内存去创建本地方法栈,那么 Java 虚拟机将会抛出一个 OutOfMemoryError 异常转载 2021-11-20 17:56:12 · 229 阅读 · 0 评论 -
本地方法接口
什么是本地方法简单地讲,一个 Native Method 就是一个 Java 调用非 Java 代码的接口。一个 Native Method 是这样一个 Java 方法:该方法的实现由非 Java 语言实现,比如 C 语言。在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 Java 语言在外面实现的。本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++ 程序。例:public class I.转载 2021-11-20 17:55:06 · 163 阅读 · 0 评论 -
jvm虚拟机栈
虚拟机栈概述1.1 虚拟机出现的背景由于跨平台的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现。缺点是性能下降,实现同样的功能需要更多的指令。1.2 内存中的栈与堆栈是运行时的单位,堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。1.3 虚拟机栈基本内容Java虚拟机栈是什么?Java虚拟机栈(Java Virtual Mach转载 2021-11-20 17:53:40 · 256 阅读 · 0 评论 -
程序计数器
PC Register介绍JVM中的程序计数器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里并非是广义上所指的物理寄存器,或许将其翻译为pc计数器(或指令计数器)会更加贴切(也成为程序钩子),并且也不容易引起一些不必要的误会。JVM的PC寄存器是对物理PC寄存器的一种抽象模拟。作用PC寄存器用来存储指向下一条指令的地址,也即将执行的指令代码。由执行引擎读取下一条指令。它转载 2021-11-20 17:47:43 · 503 阅读 · 1 评论 -
运行时数据区概述
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定地运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。灰色的为单独线程私有的,红色的为多个线程共享的。即:转载 2021-11-20 17:45:35 · 207 阅读 · 0 评论 -
类加载器子系统
1 内存结构概述2.12 概述类的加载器及类加载的过程类加载子系统作用2.2.1类加载器子系统负责从文件系统或网络中加载class文件,class文件在文件的开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否能运行,则由Execution Engine决定。加载的类信息被存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字字面量(这部分常量信息是Class文件中常量池部分的内存映射)。类加载器Class转载 2021-11-20 17:42:55 · 201 阅读 · 0 评论 -
JVM的整体结构
1 JVM的整体结构2 Java代码执行流程3 JVM的生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。虚拟机的执行一个运行中的Java虚拟机有着一个清晰的任务:执行java程序。程序开始执行时它才会运行,程序结束时它就停止。执行一个所谓的Java程序时,真真正正在执行的是一个叫做Java虚拟机的进程。虚拟机的退出有如下的几种情况:程序正常转载 2021-11-20 17:35:43 · 268 阅读 · 0 评论 -
javac的编译过程
原创 2019-01-10 11:29:14 · 2071 阅读 · 0 评论 -
volatile和synchronized的区别
volatile和synchronized的区别volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的 volatile仅能实现变量的修改可见性,不能保证原子性;...转载 2019-01-15 17:42:19 · 105 阅读 · 0 评论 -
tomact类加载器架构
原创 2019-01-09 19:21:59 · 183 阅读 · 0 评论 -
静态多分派
静态分派静态类型变量:实际类型变量:所有依赖静态类型来确定方法执行版本的分派动作属于静态分派。静态分派的典型应用就是方法重载。动态分派 所有依赖实际类型来确定方法执行版本的分派属于动态分派。动态分派的典型应用就是方法的重写。单分派与多分派 方法的接受者与方法的参数统称为宗量。根据宗量的多少,可以确定是单分派还是多分派。宗量是一个的是单分派,有一个以上的宗量的...原创 2019-01-09 18:54:58 · 387 阅读 · 0 评论 -
垃圾收集算法
标记-清除算法缺点:1.效率不高;2.空间碎片太多。复制算法 为了解决效率问题,就有了复制算法。复制算法就是将内存分配为两块空间,当其中一个进行垃圾收集完成后,将剩下的复制到另外一块,同时清除掉当前内存中的所有信息。缺点就是内存被分为两部分,导致可以使用的内存区域减少。标记--整理算法 标记整理算法是在标记清除算法的基础上来的,前面都一样,先进行标记,但是,在标记整...原创 2018-12-30 16:12:23 · 137 阅读 · 0 评论 -
hotspot的算法实现
枚举根节点 枚举根节点的时候,执行系统必须停下来。但是虚拟机不需要一个不漏的去检查。虚拟机有办法直接知道哪些地方存在对象引用。在Hotspot中使用的是oopmap的数据结构。安全点 Hotspot没有为每条指令生成oopmap,如果生成,将会产生大量的资源浪费,只是在特定的位置记录下来,这些位置称为安全点。安全点的选定有基本上是以能否让程序长时间执行为标准。这里有两种方案...原创 2018-12-30 16:14:04 · 336 阅读 · 0 评论 -
垃圾收集器
serial收集器serial收集器是历史最悠久的。serial收集器是单线程,当开始工作的时候,暂停所有正在执行的程序,然后执行垃圾收集。这点是很难接受的。但是在客户端使用的时候,它的有点是简单高效的。parnew收集器 parnew收集器就是serial收集器的多线程版本,并没有多少创新之处。是需要运行在服务器模式下的首选。有一个与性能无关,但是很重要的原因,就是除了se...原创 2018-12-30 16:15:15 · 128 阅读 · 0 评论 -
内存分配与回收策略
对象优先在eden分配大多数情况下,对象优先分配到新生代Eden中,当Eden中没有足够的空间的时候,虚拟机将发起一次minor GC。如果放不下,将会放到survivor,还不够大,将会放到老年代中。大对象直接进入老年代大对象直接放到老年代中,可以通过-xx:pretennresizethreshold参数进行设置,令大于这个值得对象直接存到老年代中。这个参数只对serial和par...原创 2018-12-30 16:16:32 · 417 阅读 · 0 评论 -
java内存区域与内存溢出异常
概述 java程序员将内存控制的权利交给了虚拟机,如果不了解虚拟机是如何运行的,那么一旦出现内存泄漏和溢出方面的问题,排查错误将会是一项艰难的工作。运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干数据区域。这些区域都有各自的用途,以及创建和销毁的时间。java虚拟机管理的内存将会包含以下一个区域:方法区,虚拟机栈,本地方法栈,堆,程序计数...原创 2018-12-30 16:37:07 · 197 阅读 · 0 评论 -
string,stringbuffer与StringBuilder的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看,也便于加深自己学习过程中对这些知识点的记忆,如果哪里有误,恳请指正。 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。首先说运行速度,或者说是执行速度,在这方...原创 2018-12-30 16:48:01 · 160 阅读 · 0 评论 -
JAVA编译后class文件的结构
原创 2018-12-30 17:13:12 · 362 阅读 · 0 评论 -
String方法的intern()方法
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的String对象会直接存储在常量池中。 如果不是用双引号声明的String...转载 2019-01-05 15:57:57 · 3044 阅读 · 0 评论 -
OSGi是什么
如何正确的理解和认识OSGI技术?我们从外文资料上或者从翻译过来的资料上看到OSGi解释和定义,都是直译过来的,但是OSGI的真实意义未必是中文直译过来的意思。OSGI的解释就是Open Service Gateway Initiative,直译过来就是“开放的服务入口(网关)的初始化”,听起来非常费解,什么是服务入口初始化?所以我们不去直译这个OSGI,我们换一种说法来描述OSGI技术。...转载 2019-01-05 16:19:55 · 239 阅读 · 0 评论 -
asm
https://blog.csdn.net/coslay/article/details/43370985ASM系列之一:初探ASM 一、什么是ASM ASM是一个JAVA字节码分析、创建和修改的开源应用框架。在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法。与传统的BCEL和SERL不同,在ASM中提供了更为优雅和灵活的操作字节码的方式。目前ASM已被广泛的开...原创 2019-01-05 19:16:25 · 4455 阅读 · 1 评论 -
对象已死么
垃圾回收前需要知道哪些对象需要被收集,就需要知道哪些对象是死了还是活的。下面就是知道哪些对象是死是活的算法。引用计算法 引用计数算法是每次使用一个对象的时候就加1,不使用后就减1,为0了,就说明这个对象死了。但是java中没有使用引用计数算法,因为java中存在着循环引用的问题,所以不行。可达性分析算法 通过一系列称为GC roots的对象作为起始点,开始搜索下...原创 2018-12-30 16:10:33 · 177 阅读 · 0 评论