首页 > 其他分享 >JVM

JVM

时间:2023-04-26 11:45:05浏览次数:36  
标签:标记 算法 幸存 GC 内存 JVM 伊甸园

JVM

JVM模型图

 

native关键字

凡是带了native关键字的说明java的作用范围达不到了,会去调用底层C语言的库

,会进入本地方法栈。调用本地方法栈的接口 JNI,扩展java的使用,融合不同的编程语言为java使用。

方法区

静态变量(static),常量(final),类的信息,运行时的常量池存在方法区中,但是实例变量存在堆内存中和方法区无关。

堆 heap

一个JVM只有一个堆,堆里面不可能有垃圾。

堆内存满了会出现OOM错误,可以通过调节才参数扩大堆内存。如果还是报错就分析内存看哪里有错误。(需要专业的工具)

垃圾回收机制GC

分为新生区(新生区又分为伊甸园区、幸存区0区、幸存区1区)、养老区、永久存储区。垃圾回收分为轻回收和重回收,轻回收主要在伊甸园区,重回收主要在养老区。

 

新生区

类:诞生和成长甚至死亡的过程。

伊甸园区:所有对象都在伊甸园区new出来。

当新new出来的对象将伊甸园的空间沾满时,这时候会进行一次轻GC(只清理伊甸园区和幸存区的垃圾),将伊甸园区的数据放入到幸存区,每进行一次轻GC两个幸存区就会发生交换(专业叫做幸存to、幸存from,总要保证一个为空,谁是空谁就是to。好处:垃圾回收算法用到复制算法)幸存to变为幸存from、幸存from变为幸存to,当一个对象进行15次轻GC后还活着,这个对象就会进入到老年区。当幸存区的内存也被沾满的时候,就会进行一次重GC(对全局进行清理),这时候大部分的垃圾都会被清理掉,但是还有一部分是有用的数据,这时候就会放入到老年区。

永久区

永久区是常驻内存的,用来存放JDK自己的类,存放java运行的环境和自带类的信息,永久区里面不可能存在垃圾回收。当JVM关闭时,永久区里的东西销毁。

在jdk1.7之前都叫永久区。但在jdk1.8之后叫元空间。

GC的算法

标记清除法、标记压缩法、复制算法、引用计数法

引用计数法

给每个对象都分配一个计术器(计数器本身就有消耗)

 

复制算法(幸存区用到了)

幸存区to和幸存区from用到了复制算法。可看上面的新生区

 

好处:没有内存碎片。永远有一半的空间。

坏处:浪费了一半的内存,分两个幸存区。假设一个幸存区满了,每次进行轻GC,都会全部复制。效率问题。

最佳使用场景:对象存活不高的情况

标记清除法

 

优点:不需要额外的空间。

缺点:两次扫描,严重浪费空间,会产生内存碎片。

标记压缩法

在标记清除的算法上在进行一次扫描将存活的对象向前移。

 

算法比较

内存效率:复制算法 > 标记清除算法 > 标记压缩算法

内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法

内存利用率:标记清除算法 = 标记压缩算法 > 复制算法

标签:标记,算法,幸存,GC,内存,JVM,伊甸园
From: https://www.cnblogs.com/aseed/p/17355173.html

相关文章

  • 你不太熟悉的JVM命令配置参数
    导读JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器,然而我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码,等等。不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会......
  • jvm Classload method介绍
    1,jvmClassload默认几个重要方法介绍findClass:FindsandloadstheclasswiththespecifiednamefromtheURLsearchpath.找到class文件并把字节码加载到内存中,如果自定义的加载器仅覆盖了findClass,而未覆盖loadClass(即加载规则一样,但加载路径不同......
  • @JvmDefault is only supported since JVM target 1.8. Recompile with '-jvm-target
    问题Logcat提示’@JvmDefault’isonlysupportedsinceJVMtarget1.8.Recompilewith'-jvm-target1.8’解决在gradle中插入以下代码android{//..其他代码...kotlinOptions{jvmTarget="1.8"}}问题Logcat提示:Usageof‘@JvmDefault......
  • JVM调优笔记(一)--Nacos GC引发的服务批量下线问题
    故障背景线上批量发服务下线的告警邮件,偶发nacos连接超时。采用了springbootadmin(以下称sba)进行服务监控。原因分析因为sba服务是基于nacos对其它服务进行监控,所以遇到这个问题,第一怀疑对象是nacos发生问题,但不清楚具体是什么问题。由于服务过一段事件会恢复,所以nacos肯定是......
  • 从栈帧看字节码是如何在JVM中进行流转的
    从栈帧看字节码是如何在JVM中进行流转的我们都知道java文件需要编译成class文件,然后jvm负责加载并运行class文件,那么字节码文件长什么样子?字节码又是怎么执行的?工具介绍javapjavap是JDK自带的查看字节码的工具。javap的使用方法如下:$javacDemo.java$javap-p-vDemojavap命令......
  • jvm之强软弱虚引用
    强软弱虚引用在java中,除了基本数据类型的变量外,其他所有的变量都是引用类型,指向堆上各种不同的对象。在jvm中,除了我们常用的强引用外,还有软引用、弱引用、虚引用,这四种引用类型的生命周期与jvm的垃圾回收过程息息相关。那么这四种引用类型有什么区别?具体使用场景是什么?所有引用类型......
  • jvm之垃圾收集器
    垃圾收集器先看下图中HotSpot虚拟机所包含的收集器:图中展示了9种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、ParallelScavenge老年代收集器:CMS、SerialOld、......
  • jvm之垃圾回收算法
    垃圾回收算法哪些内存需要回收jvm的内存模型中将内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈属于线程私有的内存空间,与线程的生命周期保持一致,不需要手动回收内存。方法区中存放的是类的结构信息,对方法区的回收其实就是对类进......
  • jvm之线程上下文加载器与SPI
    线程上下文加载器线程上下文类加载器(ThreadContextClassLoader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoadercl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader......
  • jvm如何打破双亲委托机制
    打破双亲委托机制重写父类ClassLoader的loadClass方法packagecom.morris.jvm.classloader;publicclassBreakDelegateClassLoaderextendsMyClassLoader{@OverrideprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{......