jvm
基础
weixin_46101560
这个作者很懒,什么都没留下…
展开
-
力扣算法——石子游戏VI
Alice 和 Bob 轮流玩一个游戏,Alice 先手。一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平原创 2022-02-18 10:27:40 · 2444 阅读 · 0 评论 -
jvm垃圾回收——分代回收
新生代与老年代弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。(新生代)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。(老年代)新生代和老年代都是堆分配的内存,新生代分为伊甸园区(Eden)和幸存者区(Survivor)。分代垃圾回收当产生新对象时,会在伊甸园(Eden)产生,当伊甸园内存不够时,会进行一次Miner GC,先进行可达性分析标记可清除的垃圾,然后把需要的.原创 2022-02-17 20:08:48 · 812 阅读 · 1 评论 -
jvm垃圾回收算法——复制算法
复制算法先复制一块相同的区域TO,然后去标记FROM区域内的可清理的垃圾。然后把FROM区域的对象复制到TO区域,这样就不会产生内存碎片了然后交换FROM区域和TO区域缺点会占用双倍的内存空间,内存开销大优点没有内存碎片...原创 2022-02-15 16:42:25 · 338 阅读 · 0 评论 -
jvm垃圾回收算法——标记整理算法
标记整理算法标记整理法与标记清除法首先是一样的,先判断时候被GC Root引用,再进行标记,不同的是第二步,标记整理法对对象进行了整理,使内存更紧凑,从而没有产生内存碎片。优点没有内存碎片缺点速度较慢,因为牵扯到对象地址的移动...原创 2022-02-15 16:35:13 · 197 阅读 · 0 评论 -
jvm垃圾回收算法——标记清除算法
标记清除算法根据可达分析,先标记没有直接或者间接被GC Root引用的内存,然后进行“清除”,这里的清除是把被标记的起始和结束地址放到一个叫空闲地址列表里,就算是清除了,下次分配内存时会到这个列表里寻找合适的地址。优点速度快,只需要记录起始与结束的地址缺点清除后不会对内存空间进行整理,会造成内存不连续,产生内存碎片,就会导致如果新对象需要的空间太大则无法存入。如这图,空白位置合在一起是可以存入的。...原创 2022-02-15 16:28:49 · 244 阅读 · 0 评论 -
jvm垃圾回收——判断对象可以回收:引用
四种引用强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类“Objectobj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2版之后提供了SoftReference类来实现软引用。·弱引用也是用来描原创 2022-02-13 17:09:06 · 147 阅读 · 0 评论 -
jvm垃圾回收——判断对象可以回收:可达分析
基本理解Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到表示可以回收GC Root对象固定可作为GC Roots的对象包括以下几种:在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。在本原创 2022-02-13 17:00:34 · 296 阅读 · 0 评论 -
jvm垃圾回收——判断对象可以回收:引用计数
基本理解在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。内存泄露当A引用B时B引用加1,B引用A时,A引用加1;虽然没有其他来引用他们两个,但他们两个引用计数一直是1,所以不能被回收,造成泄露。...原创 2022-02-13 16:11:02 · 128 阅读 · 0 评论 -
jvm内存部分——方法区
方法区特点保存在着被加载过的每一个类的信息;这些信息由类加载器在加载类的时候,从类的源文件中抽取出来;static变量信息也保存在方法区中;可以看做是将类(Class)的元数据,保存在方法区里;方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。jvm也可以允许用户和程序指定方法区的初始大小,最小和最大限制;方法区同样存在垃圾收集,因为通过用户定义的类加载原创 2022-02-13 14:43:33 · 355 阅读 · 0 评论 -
jvm内存部分——堆
基本概念Heap 堆通过new关键字,创建对象都会使用堆内存它是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制GC堆的内存溢出当不断产生对象,且一直在使用,就会导致无法回收,造成内存溢出。public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new Arr原创 2022-02-13 11:17:57 · 190 阅读 · 0 评论 -
jvm内存结构——本地方法栈
对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持J转载 2022-02-13 10:58:42 · 117 阅读 · 0 评论 -
jvm内存部分——栈的内存溢出
栈溢出的原因栈帧过多导致内存溢出栈帧过大导致内存溢出public class JvmStacks { static int count =0; public static void main(String[] args) { method1(); } public static void method1(){ count++; method1(); }}而栈帧过大不容易实现,可以试着去调整虚拟机栈分原创 2022-02-13 10:33:03 · 410 阅读 · 0 评论 -
jvm内存部分——虚拟机栈
目录栈的特点虚拟机栈与栈帧虚拟机栈定义相关问题辨析栈的特点栈(stack)是一种常用的数据结构,遵从先入后出的规则虚拟机栈与栈帧当线程运行调用方法时,会给方法划分一段栈帧空间,如方法1划分一个栈帧1,然后压入栈内进行运行,运行完后出栈并释放内存。当方法1中调用了方法2时,则会划分一个栈帧2的空间压入栈并运行,方法2运行完后返回值交给方法1,栈帧2出栈释放空间,然后运行方法1。虚拟机栈定义Java Virtual Machine Stacks ——Java虚拟机栈每个线程运行所需要的原创 2022-02-11 11:55:54 · 562 阅读 · 0 评论 -
jvm内存部分——程序计数器
定义Program Counter Register 程序计数器(寄存器)作用 二进制字节码 jvm指令 Java 源代码0: getstatic #20 // PrintStream out = System.out;3: astore_1 //--4: aload_1 // out.println(1);5: iconst_1 //--6: invokevirtual #26 // --9.原创 2022-02-10 10:48:56 · 334 阅读 · 0 评论 -
jvm基本定义
jvm的定义Java Virtual Machine——Java程序的运行环境(Java二进制字节码的运行环境)优点一次编写,到处运行(正是jvm屏蔽了字节码和底层操作系统的差异,对外提供了一个一致的运行环境,实现了Java的跨平台运行)自动内存管理机制,实现垃圾回收功能(可能在现在看来没有什么,但在当初和C++等比较,这种方便的多,降低了内存泄露的概率)数组下标越界检查多态(虚方法表来实现多态)jvm jre jdk比较jvm的模块代码文件先通过Java Class加载成字节码文原创 2022-02-10 10:13:01 · 85 阅读 · 0 评论