自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 java线程模型的总结

java线程模型的总结在Java中,基本我们说的线程(Thread)实际上应该叫作“用户线程”,而对应到操作系统,还有另外一种线程叫作“内核线程”。用户线程和内核线程之间必然存在某种关系,多对一模型、一对一模型和多对多模型。多对一线程模型多个用户线程对应到同一个内核线程上,线程的创建、调度、同步的所有细节全部由进程的用户空间线 程库来处理。优点:用户线程的很多操作对内核来说都是透明的,不需要用户态和内核态的频繁切换,使线程的创建、 调度、同步等非常快;缺点:1.由于多个用户线程对应到同一

2021-05-11 08:43:50 272

原创 线程的本质及线程模型

线程的本质及线程模型java当中的线程和操作系统的线程是什么关系?关于操作系统的线程 linux操作系统的线程控制原语int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);可以在linux系统下面通过man手册查看该函数的定义:根据man配置的信息可以得出pthread_create会创建一个线程,这个函数是linux系统的函数,可

2021-04-28 20:03:59 209 3

原创 深入 JVM 优化技术及 JVM 历史回顾与未来

深入 JVM 优化技术及 JVM 历史回顾与未来解释执行与 JITJava 程序在运行的时候,主要就是执行字节码指令,一般这些指令会按照顺序解释执行,这种就是解释执行。那些被频繁调用的代码,比如调用次数很高或者在 for 循环里的那些代码,如果按照解释执行,效率是非常低的。以上的这些代码称为热点代码。所以,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。完成这个任务的编译器,就称为即时编译器(Just In Time Compiler

2021-04-27 20:35:27 154

原创 直接内存与 JVM 源码分析

直接内存与 JVM 源码分析直接内存(堆外内存)直接内存有一种叫法,堆外内存。直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存。这个差别与之前的堆、栈、方法区,那些内存都是经过了虚拟化。所 以严格来说,这里是指直接内存。直接内存有哪些? 使用了 Java 的 Unsafe 类,做了一些本地内存的操作; Netty 的直接内存(Direct Memory),底层会调用操作系统的 malloc 函数。 JNI 或者 JNA 程序,直接操纵了本地内存,比如一些

2021-04-27 16:45:41 164

原创 使用 MAT分析内存泄漏

使用 MAT分析内存泄漏我们前面讲过,我们可以使用 jmap –histo 这种命令去分析哪些对象占据着我们的堆空间。但是那是比较容易分析的问题,如果是遇到内存情况比较复杂 的情况,命令的方式是看不出来的,这个时候我们必须要借助一下工具。当然前提是通过 jmap 命令把整个堆内存的数据 dump 下来。内存分析工具VisualVM这个是上节的那个案例抛出了 OOM 后到处的内存的 dump 日志信息,我们可以导入VisualVm 属于比较寒酸的工具,基本上跟 jmap 之类的命令没多

2021-04-27 11:54:46 805

原创 JVM 性能调优之内存优化与 GC 优化

JVM 性能调优之内存优化与 GC 优化JVM 调优是一个系统而又复杂的过程,但我们知道,在大多数情况下,我们基本不用去调整 JVM 内存分配,因为一些初始化的参数已经可以保证应用 服务正常稳定地工作了。在应用服务的特定场景下,JVM 内存分配不合理带来的性能表现并不会像内存溢出问题这么突出。一般你没有深入到各项性能指标中去,是很难发现其 中隐藏的性能损耗。压测工具 ABAb(ApacheBench) 测试工具是 Apache 提供的一款测试工具,具有简单易上手的特点,在测试 Web 服务时非常实用

2021-04-26 11:23:01 208

原创 动态追踪技术底层分析

动态追踪技术底层分析动态追踪技术是一个可以不用重启线上 java 项目来进行问题排查的技术,比如前面讲的 Arthas 就属于一种动态追踪的工具。它里面提 供的 monitor 还有 watch 等命令就是动态的追踪技术。当然我们学技术要知其然还要知其所以然,Arthas 工具的基础,就是 Java Agent 技术,可以利用它来构建一个附加的代理程序,用来 协助检测性能,还可以替换一些现有功能,甚至 JDK 的一些类我们也能修改,有点像 JVM 级别的 AOP 功能。Java Agent 技术既然

2021-04-22 11:23:43 403

原创 GC 调优基础知识之工具篇

GC 调优基础知识之工具篇JDK 为我们提供的工具这些工具在 windows 上,就是这些 exe,其他的平台不同在 linux 中,一般自带了 OpenJdk,一般情况下 JPS 等命令不能用,要么选择去安装 JPS 等插件,要么把 OpenJdk 卸载,去重新安装 Oracle 的 JDK,我推荐后者。命令行工具jps列出当前机器上正在运行的虚拟机进程,JPS 从操作系统的临时目录上去找(所以有一些信息可能显示不全)。q :仅仅显示进程,-m:输出主函数传入的参数. 下的 hello

2021-04-21 16:48:38 321

原创 JAVA语法糖及实现

JAVA语法糖及实现Java 中的泛型泛型是什么:泛型,即“参数化类型”,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。引入一个类型变量 T(其他大写字母都可以,不过常用的就是 T,E,K,V 等等),并且用<>括起来,并放在类名的后面。泛型类 是允许有多个类型变量的。按照约定,类型参数名称命名为单个大写字母,以便可以在使用普通类或接口名称时能够容易地区分类型参数。以下是常用的类 型参数名称列表: E - 元素,主要由 Java 集合(Collections)框架使用。

2021-04-21 15:50:23 174

原创 方法调用的底层实现

方法调用的底层实现我们写的代码,经过编译、经过类加载的各种阶段,进入了 JVM 的运行时数据区。但作为程序员真正关心是代码的执行,代码的执行其实本质上是方法的执行,站在 JVM 的角度归根到底还是字节码的执行。 main 函数是 JVM 指令执行的起点,JVM 会创建 main 线程来执行 main 函数,以触发 JVM 一系列指令的执行,真正地把 JVM 跑起来。 接着,在我们的代码中,就是方法调用方法的过程,所以了解方法在 JVM 中的调用是非常必要的。方法调用的字节码指令关于方法的调用,Java

2021-04-21 11:19:20 151

原创 类加载与类加载器

类加载与类加载器一个类的生命周期类生命周期 7 个阶段类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、 初始化(Initialization)、使用(Using)和卸载(Unloading)7 个阶段。其中验证、准备、解析 3 个部分统称为连接(Linking)。阶段顺序加载、校验、准备、初始化和卸载这五个阶段的顺序是确定的,但是对于“解析”阶段则不一定,

2021-04-20 16:54:37 115

原创 Class 文件结构及深入理解字节码指令

Class 文件结构及深入理解字节码指令JVM 的无关性与平台无关性是建立在操作系统上,虚拟机厂商提供了许多可以运行在各种不同平台的虚拟机,它们都可以载入和执行字节码,从而实现程序的“一次编写,到处运行”(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础

2021-04-19 20:47:55 225

原创 垃圾回收器串讲及hotspot细节实现

垃圾回收器串讲及hotspot细节实现并发标记与三色标记三色标记在三色标记法之前有一个算法叫 Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是 0,如果发现对象是可达的就会置为 1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后,会将未被标记的对象统一清理,再次把所有的标记位设置成 0 方便下次清理。这个算法最大的问题是 GC 执行期间需要把整个程序完全暂停,不能异步进行 GC 操作。因为在不同阶段标记清扫法的标志位 0 和 1

2021-04-19 16:42:56 120

原创 分代回收机制和垃圾回收算法

分代回收机制和垃圾回收算法垃圾回收基础知识什么是 GCJava 与 C++等语言最大的技术区别:自动化的垃圾回收机制(GC)为什么要了解 GC 和内存分配策略:1、面试需要2、GC 对应用的性能是有影响的;3、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注 堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点分代回收理论当前商业虚拟机的垃圾回收器,大多遵循“分代收集”的理论来进行设计,这个理论大体上是这么描述的

2021-04-19 10:56:59 1585

原创 jvm中的对象和引用

jvm中的对象和引用JVM 中对象的创建过程对象的内存分配虚拟机遇到一条 new 指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。类加载就是把 class 加载到 JVM 的运行时数据区的过程(类加载后面有专门的专题讲)。1)检查加载首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用(符号引用 :符号引用以一组符号来描述所引用的目标),并且检查类是否已经被加载、解析和初始化过。2)分配内存接下来虚拟机将为新生对象分配内存。为对象分配空间的任务等同于把一块

2021-04-16 16:09:56 148

原创 深入理解jvm内存区域

深入理解 JVM 的内存区域深入理解运行时数据区示例代码:1.JVM 向操作系统申请内存:JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终止地址分配给 JVM,接下来 JVM 就进行内部分配。2.初始化运行时数据区:JVM 获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小。-Xms30m -Xmx30m -Xss1m -XX:MaxMetaspaceSize=30m3.类加载:这里主要是把 class

2021-04-15 21:07:59 179

原创 虚拟机的发展和java内存域

虚拟机的前世今生和java内存区域jvm基础知识java文件的执行流程:

2021-04-15 14:58:41 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除