
jvm
jvm相关知识
古笑来
愿今日之所作,可为君行一时方便!
展开
-
jdk、jre、jvm
JDK的组成jre 加 工具类库jre是什么Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。也是通过它,Java的开发者才得以将自己开发的程序运行。与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。jvm是什么JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核原创 2021-12-16 10:48:47 · 125 阅读 · 0 评论 -
类成员执行顺序
静态 常量 构造方法 各自从上倒下执行,和其他的没有关系。静态方法会被加载,不会被执行。原创 2021-12-16 10:48:36 · 146 阅读 · 0 评论 -
jdm常量池
常量池(静态常量池):编译时每个class文件中都存在常量池,class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant pool table),用于存放编译期生成的各种字面量和符号引用。运行时常量池:运行时常量池这部分内容,在类初始化进入运行时常量池中存放字符串常量池:只会存储一份,被所有的类共享。创建字符串之前检查常量池中是否存在,如果存在则获取其引用,如果不存在则创建并存入,返回新对象引用。常量池的演变1.7之前1.71.8方法区 是一种理原创 2021-12-16 10:47:47 · 135 阅读 · 0 评论 -
jmm内存模型
jvm与jmm关系个人理解jvm包括jmm,jmm只是内存方面的定义。什么是jmmJMM就是Java内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果。jmm主要包括什么堆 方法区 栈 本地方法栈 程序计数器java7和java8的内存模型有什么不一样最大原创 2021-12-16 10:47:23 · 2443 阅读 · 2 评论 -
jvm概念理解
每一个程序jvm都会为其分配一个jvm实例每一个jvm实例有自己的堆,堆为一块内存区域,存放java对象每一个线程有自己的栈(栈,本地方法栈 - 看虚拟机的实现),栈存放引用堆是堆(heap),栈是栈(stack),堆栈是栈。我很不喜欢“堆栈”这种叫法,容易让新人掉坑里。JVM里的“栈”(stack)存放基本类型的变量数据和对象的引用。但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是原创 2021-12-16 10:47:11 · 112 阅读 · 0 评论 -
jvm类加载器
通过什么来加载class类类加载器类加载器的任务是什么类加载器的任务是根据一个类的全类名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例。你知道哪几种类加载器3种引导(Bootstrap)类加载器扩展(Extension)类加载器系统(System)类加载器(也称应用类加载器)自己写的类加载器引导(Bootstrap)类加载器启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将原创 2021-12-16 10:46:57 · 319 阅读 · 0 评论 -
逃逸分析、栈上分配
逃逸分析、栈上分配栈上分配,可以直接随方法的销毁而销毁,减轻jc的压力逃逸分析,可以确定一个对象是否会被其他线程进行访问。1、全局逃逸(GlobalEscape)即一个对象的作用范围逃出了当前方法或者当前线程,有以下几种场景:对象是一个静态变量对象是一个已经发生逃逸的对象对象作为当前方法的返回值2、参数逃逸(ArgEscape)即一个对象被作为方法参数传递或者被参数引用,但在调用过程中不会发生全局逃逸,这个状态是通过被调方法的字节码确定的。3、没有逃逸即方法中的对象没有发生逃逸..原创 2021-12-16 10:48:57 · 174 阅读 · 0 评论 -
gc-root
什么区域的对象可以作为gc root虚拟机栈(栈帧中的本地变量表)中引用的对象本地方法栈中 JNI(即一般说的 Native 方法)引用的对象方法区中 静态属性引用的对象方法区中 常量引用的对象finalize它是Object中的方法Java虚拟机一旦通过刚才提到的“根搜索算法”判断出某对象处于可回收状态时,会判断该对象是否重写了Object类的finalize方法,如果没,则直接回收。如重写过finalize方法,而且未执行过该方法,则把该对象其放入F-Queue队列,另个线程会定时遍原创 2021-12-15 10:05:50 · 167 阅读 · 0 评论 -
oom内存泄露
六大oom都有那些?堆溢出java.lang.OutOfMemoryError: Java heap space栈溢出java.lang.StackOverflowError元空间溢出java.lang.OutOfMemoryError: Metaspace直接内存溢出java.lang.OutOfMemoryError: Direct buffer memory创建线程过多 linux默认一个应用最多1024个线程,这个数量是可以调的java.lang.OutOfMemoryErro原创 2021-12-15 10:05:12 · 297 阅读 · 0 评论 -
双亲委派机制
你写个类加载器,这个累加加载器就会生效么?不会那在类加载过程中使用的机制或者方法是什么?双亲委派机制什么是双亲委派机制如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是使用代理模式,把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。双亲委派的优势采用双亲委派模式的是好处是Java类随着它的类加原创 2021-12-15 10:04:39 · 131 阅读 · 0 评论 -
jvm垃圾回收
四大垃圾回收算法引用计数法:每次引用对象就被计数器+1,失去引用的时候就-1,但对于复杂引用,需要额外的开销。目前几乎不用这个算法。(标记)复制:将内存区域划分成两个等大的区域,同一时间只能使用一半的区域。先标记,再移动活着的对象到另一个空区域。执行效率不可控 浪费空间 垃圾对象少的时候,需要复制大量的对象标记清除:先标记在清除。 执行效率不可控 内存碎片,当给大对象分配内存空间的时候,都是内存碎片,没有连续的大内存,就有会触发gc标记整理:标记并将活着的对象移动到内存空间的一端,然后将存活对原创 2021-12-15 10:03:46 · 535 阅读 · 0 评论 -
类加载过程
class执行执行的流程 加一次验证准能解初来什么是类加载每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的".class"文件,并创建对应的class对象。将class文件加载到虚拟机的内存,这个过程称为类加载。类加载的过程的五步加载:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Cl原创 2021-12-15 09:59:31 · 92 阅读 · 0 评论 -
慢的yong-gc怎么排查
因为新生代垃圾收集算法采用的复制算法,因为新生代存活对象过多,导致GC时间长因为程序书写不当进入SafePoint的时间过长,导致GC时间过长清理各类引用的时间过长加入参数,看gc过程中的详细日志,执行时间。dump下对象来,结合分析。SafePoint是程序中的某些位置,线程执行到这些位置时,线程中的某些状态是确定的,在safePoint可以记录OopMap信息,线程在safePoint停顿,虚拟机进行GC。线程停顿方式有两种,抢先式中断和主动式中断:抢先式中断:虚拟机需要GC时,中断所有线程原创 2021-12-15 09:57:58 · 1062 阅读 · 0 评论 -
minor-gc为什么比full-gc快
minor gc :①minor gc 需要扫描的对象很少②扫描后需要复制有效对象也很少full gc:①扫描的对象较多(young和old区都要),②真正需要清除的往往较少(能够分配到老年代的往往都是老油条对象了),换句话说需要“整理/压缩/移动”的对象数量较多。...原创 2021-12-15 09:56:45 · 150 阅读 · 0 评论 -
jvm先关问题
Java内存模型 (JMM) 硬件内存架构1.8 堆 栈 本地栈 计数器 元空间常量池、运行时常量池、字符串常量池、静态变量、方法区 在哪常量池又称静态常量池,在class类里面,初始化的是后被加载到运行常量池中运行时常量池在元空间(方法区)中字符串常量池在堆中静态变量在元空间(方法区)中方法区是jmm理论模型中的东西,hotsport在1.7实现叫做永久代,在1.8是元空间逃逸分析、栈上分配?经过逃逸分析的对象被分配到栈上。对象只存在与方法中,没有跳出方法的引用对象,可以称作逃逸对象原创 2021-12-15 09:56:11 · 92 阅读 · 0 评论