目录

很有名 の weblog

标签: JVM (8)

JVM垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

JVM内存分配机制与垃圾回收算法

JVM内存分配机制与垃圾回收算法

JVM指令手册

JVM指令手册

JVM内存模型深度剖析

1. JVM整体结构及内存模型 这里从一个类被加载开始说起,当一个类被加载的时候,会被加载到Java的内存区中,也就是运行时数据区。当然 内存区主要分为堆,栈(线程),本地方法栈,方法区(元空间),程序计数器。 1.1 栈(线程) 栈也是一块内存区域,就是当程序开始运行的时候,给运行的这个线程单独开辟的一块内存区域。假如又有新的线程进行产生,也会给新的线程开辟栈空间。 也就说栈是每一个线程进行独享的。 在栈的内部,有栈帧。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。这注意看啊,是给方法进行存储的。例如,当一个main()方法启动时,主线程会先给main()方法分配一个栈帧,而栈帧中又调用了compute()方法,那么主线程又会给compute()方法分配一个栈帧。 而且因为根据栈的数据结构,先进后出,意味着,main()方法在栈的底部,compute()方法在main()方法的上方。当compute()方法执行完成之后,便进行出栈。如上图右侧演示。 在栈帧内部,还有小块内存区域,分别是局部变量表,操作数栈,动态链接,方法出口等。 举个例子: public cl....

类加载机制深度剖析

类加载器和双亲委派机制,以及tomcat为何需要打破Java推荐的双亲委派机制

无停顿GC算法,ZGC原理

文章翻译的是,Azul Systems很多年前提出的Pauseless GC

记一次项目线上的内存暴增以及解决办法

前景提要 项目上线了,在开发时一切正常,运行正常,项目上线后,还没运行一个星期,发现项目运行越来越慢,进入后台管理界面用了30秒。当时刚听到这个消息,“怎么可能!!!内测,都还没几个人用呢”,直到我自己打开系统,等了好久才进入系统,信了。 线索追踪 查看错误日志 知道系统出现了问题,但是线上的系统我又碰不到,申请下,运维人员带我去了机房,真是戒备森严。查看错误日志,没有关键的信息。想让运维人员给我把错误日志拿出来,我回去研究研究,被语气很强硬的直接否决了。。。 查看程序运行状态 使用 px -aux |grep *** 定位程序pid top -p <PID> 查看程序占用内存 虽然这个系统比较大,但是占用的内存达到了4GB,真是可怕。 jmap查看线上程序运行的内存信息 jmap -histo <PID> 刷刷刷一段文字,上一张本地演示的图,是之后在本地复现的截图 简单的说说这个图里有啥 num:序号 instances:实例对象 bytes:占用的大小 class name:类名称,B就是byte[],C就是char[],I就是int[],如果还有....

Java内存模型(Java升级计划1)

Java内存模型 JVM什么时候启动 类被调用的时候 启动JVM线程,再启动其他的线程,包括main线程,也就是JVM线程创建了其他的线程。 线程在JVM中是怎么运行的 方法区:存放的是一些加载的类信息(类加载器加载classload),常量,static变量,JIT编译后的代码。,也可以出现out of memory JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。 Java堆区:大量的实例对象,也可以出现out of memory 方法区和堆区可以实现信息共享 VIM Stack:Java在运行时的内存模型,数据私有,不能实现数据共享 每一个方法有唯一的栈帧去对应去存放数据 当栈帧放满了VIM Stack时,任然不断的添加,就会出现内存溢出,也可以出现out of memory 程序计数器(PC):Java线程的私有数据,这个数据就是执行下一条指令的地址,也就是说当这条指....