![](https://img-blog.csdnimg.cn/20201025105048470.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm
文章平均质量分 79
jvm学习笔记
德墨忒尔
不积跬步,无以至千里;不积小流,无以成江海。
展开
-
常用Java虚拟机参数
打印GC日志-XX:+PrintGCjdk9之后建议使用 -Xlog:gc[GC (Allocation Failure) 4676K->2628K(9728K), 0.0004307 secs][GC (Allocation Failure) 4676K->2628K(9728K), 0.0004717 secs][GC (Allocation Failure) 4676K->2628K(9728K), 0.0006033 secs][GC (Allocation F原创 2020-11-28 22:50:28 · 419 阅读 · 0 评论 -
JVM 方法区详解
栈、堆、方法区的交互关系从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理下面就涉及了对象的访问定位Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方原创 2020-11-28 22:47:55 · 238 阅读 · 0 评论 -
JVM 堆(heap)详解
堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allo原创 2020-11-28 22:10:23 · 1211 阅读 · 0 评论 -
java四种引用类型(强引用 软引用 弱引用 虚引用)
强引"/;.l,“?:> k”强引用就是程序中一般使用的引用类型,强引用的对象是可触及的,不会被回收。强引用可以直接访问目标对象强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指的对象强引用可能会导致内存泄漏软引用如果一个对象只持有软引用,那么当堆空间不足时,就会被回收。软引用使用java.lang.ref.SoftReference类实现。下面演示软引用在堆内存不足的情况下被回收public class SoftRef {原创 2020-11-28 21:01:52 · 110 阅读 · 0 评论 -
JVM 本地方法接口、本地方法栈
本地方法接口什么是本地方法本地方法是一个非Java的方法,它的具体实现是非Java代码的实现在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。代码举例说明Native方法是如何编写的public class IhaveNatives { public native void Native1(int x);原创 2020-11-28 18:22:52 · 89 阅读 · 0 评论 -
JVM虚拟机栈
虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。首先栈是运行时的单位,堆是存储的单位栈解决程序如何执行,如何处理数据堆解决的是数据存储问题,即数据怎么放,放在哪里Java虚拟机栈,早期也叫Java栈,每个线程创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次方法调用,生命周期和线程的一致,主管Java程序的运行,它保存方法的局部原创 2020-11-28 18:19:09 · 123 阅读 · 0 评论 -
JVM垃圾回收相关算法
GC的垃圾特指存在内存中的、不会被使用的对象,对这些垃圾回收,这样内存就会有区域被腾出来,如果大量不会被使用的对象一直占用空间,就会导致内存溢出。java是虚拟机负责垃圾回收,开发效率高,执行效率低,C++手工处理垃圾,容易忘记回收,内存泄漏回收多次非法访问开发效率低、执行 效率高引用计数法(Reference Couting)引用计数法的实现比较简单,就是一个对象,有几个引用指向了它,它的引用计数器就是几,当变成0是,就是没有任何一个引用指向它,这个对象就不可能再被使用。但是引用计数原创 2020-11-28 18:14:17 · 99 阅读 · 0 评论 -
对象的创建过程、内存布局、定位、分配
对象的创建过程当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否加载、解析和初始化过。如果没有,先将class loading到内存linking过程:verification校验,preparation把类的静态变量设默认值,resolution将符号引用解析成直接引用intializing初始化,把类的静态变量设为初始值并执行静态代码块分配内存指针碰撞(Serial、ParNew等原创 2020-11-23 01:05:41 · 195 阅读 · 0 评论 -
单例模式下为什么一定要加volatile关键字
有一道面试题,单例模式已经双重检查锁定(Double-Check-Lock)了,要不要加volatile关键字。以下是双重检查锁定来实现单例模式代码public class DoubleCheckLock { private static DoubleCheckLock INSTANCE; private DoubleCheckLock() { } public static DoubleCheckLock getInstance() { if (I原创 2020-11-19 00:42:07 · 1340 阅读 · 2 评论 -
使用ASM框架实现统计函数执行时间
定义ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。实现现在使用ASM框架,在不修改源代码的情况下实现统计函数执行原创 2020-11-18 22:31:37 · 733 阅读 · 0 评论 -
从一个class文件深入理解Class文件结构
深入理解Class文件结构概述我们都知道编写的Java的源码会先编译成Class文件,java虚拟机再将Class文件解释编译成对应平台的机器指令,所以能够解析Class文件的数据结构是非常有必要的。先编写一段java源码,定义一个类并实现一个接口,类内部定义了一个成员变量、一个类变量和一个sum方法。package com.changyy.jvm;public class ClassTest implements IClassTest { private int n = 10原创 2020-11-03 17:03:34 · 408 阅读 · 0 评论 -
JVM 程序计数器
程序计数器(PC寄存器)介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。程序计数器是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。它可以被原创 2020-10-26 16:56:57 · 148 阅读 · 0 评论 -
JVM运行时数据区概述及线程
运行时数据区概述及线程运行时数据区概述内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区)Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用于线原创 2020-10-26 10:53:08 · 119 阅读 · 0 评论 -
JVM类加载子系统
类加载子系统1、JVM整体架构简图完整图2、类加载器与类的加载过程类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包含字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存原创 2020-10-26 00:12:46 · 487 阅读 · 0 评论 -
JVM与Java体系架构
JVM与Java体系架构1、前言作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就gg了每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。大部分Java开发人员,除去在项目中使用到与Java平台相关的各种高精尖技术,对于Java技原创 2020-10-25 08:41:52 · 294 阅读 · 0 评论 -
JVM 执行引擎
JVM 执行引擎1、执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的机构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够原创 2020-10-24 20:54:35 · 230 阅读 · 0 评论