运行时数据区
program counter register 程序计数器
java方法 存 正在执行的字节码指令地址 native方法 为空undefined
每个线程有一个独立的
规范没有规定ooM
vm stack
线程私有
一个方法有一个stack frame 存局部变量 操作数栈 动态链接 方法出口 方法调用 压栈 出栈
如果线程请求的栈深度大于虚拟机允许的 stackoverflowerror
如果vm stack可以动态扩展 扩展时无法申请到足够的内存 OOM
private static void oom(int i){
while(i>1){
oom(i);
}
}
public static void main(String[] args) {
oom(2); //28592 call
}
native method stack
对应native方法
也会sof oom
java heap
线程共享
存 对象实例
新生代 老生代 survior
线程私有的分配缓冲区 thread local allocation buffer
没有内存完成实例分配 并且无法扩展 OOM -Xmx -Xms
method area 方法区
线程共享
类信息 常量 静态变量 (字符串常量池 永久代)
hotspot 永久代实现方法区(省去为方法区写内存管理) permanent generation
-XX:MaxPermSize
OOM
运行时常量池runtime constant pool
class文件常量池 运行期也可以放进去 string.intern()
导致OOM
direct memory
nio 使用时分配
导致内存区域总和大于物理内存限制 动态扩展时出现OOM
对象的内存布局
header hashcode gc分代 锁状态
instance data
padding 占位符
栈容量 -Xss
每个线程分配栈容量 线程太多可能导致内存不够 栈内存OOM
OOM Error message
Java heap space
unable to create new native thread
PermGen space //动态生成大量class 大量jsp osgi
diect memory //dump文件很小 nio
GC
引用计数 无法回收循环引用
可达性分析 GC Roots 可达到的对象
引用 不等于必要, 解决方法: 强引用 软引用 弱引用 虚引用
finalize方法只会被调用一次 下次GC不会调用
永生代 常量池回收 无用类回收
垃圾收集算法
标记-清除算法
效率问题
内存碎片问题
复制算法
内存变为原来一半
商业虚拟机用此算法回收新生代
标记-整理算法
对老生代使用
存活对象向一端移动
分代收集算法
根据分代使用以上几种算法
内存分配
小对象直接进入eden
大对象(需要大量连续内存空间,很长的字符串及数组) 避免经常出现短命的大对象提前触发GC
新对象进入eden,熬过一次Minor GC进入survivor,age设为1,到15岁后进入老生代
动态年龄判定
线程快照
threaddump/javacore
堆转储快照
headdump/hprof
jvm监控命令
jps
jinfo
jstat -gcutil vmid
jmap 堆快照 -heap -histo
jhat 分析堆快照文件
jstack 线程快照
jconsole
visualVM
heap analyzer
memory analyzer tool
class loader
任一个类 由类加载器和类本身 确立其在JVM中的唯一性
从JVM看 2种类加载器
C++实现的bootstrap classloader, JVM的一部分
java实现的其他加载器, JVM外部
java开发人员看
bootstrap 加载JAVA_HOME/lib下的
extension 加载JAVA_HOME/lib/ext下的
application 加载classpath下的
类加载器的层次用组合实现
加载类的时候首先委托父类,父类没法再自己加载
不是所有都是这样, jndi等spi、OSGi不是
GC性能指标
throughput GC花的时间越少,系统计算吞吐量越大 //适用于后台非实时计算
pause time stop the world时间// 实时交互系统很看重,如网站
frequency 频率
footprint a measure of size, such as heap size
promptness 对象成为垃圾到对象内存重新变为可用的时间间隔
GC设计抉择
串行 并行
并发 stop the world
压缩 不压缩 复制
behavior-based tuning
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
分享到:
相关推荐
jmap -heap pid可以查看应用程序堆的信息jstat可以打印元空间信息MC :分配到元空间大小MU:已使用的元空间大小 元空间是可以自己扩容的元空间:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 可以看jvm参数查看网址 Direct buffer memory : 直接内存太大(-XX:MaxDirectMemorySize=100m) Java heap space: 堆内存溢出 (-Xms30m -...
notes JVM: java虚拟机 一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 三:下篇——性能监控与调优篇 一: 上篇——内存与垃圾回收器 架构: jvm依赖的架构: 栈架构/寄存器架构 栈架构 JVM的生命周期: ...
Notes 我的笔记: 知识不总结,就会被大脑当垃圾清理 :horse:求知之路必然不会一帆风顺,唯有以勤为刃,以习惯为马,劈懒斩愚,跨越舒适区,方能知众人所不知,晓众人所不晓。 :person_walking:勤于思考的人,就算散步...
loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 常用设计模式 单例模式 , 工厂模式 , 装饰者模式 , 代理...
Notes:学习笔记:java,Javaweb,LInux,计算机网络,操作系统,JVM虚拟机,数据结构
learning-notes 常用算法 工作窃取算法 实际面试笔试题 海量数据处理 特点:资源有限,无法一次性处理 思路:分而治之 1、JVM内存受限为5M,现在需要统计一份文件(文件大小为2G)里出现频次较高的top100的单词,请...
MD-Notes:后端笔记总结 关于 MD-Notes: 业余时间学习技术的同时,做一些记录和总结并乐于分享。 日常主要接触 Web 前后端开发、Linux 运维等,有 Java / Python 后端经验,有大数据开发 Flink,Spark 实战经验,...
Docker部署Prometheus注:可使用Prometheus + Grafana 监控 JVM启动 prometheus pushgateway启动 pr
第2章-Java并发机制的底层实现原理Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编
介绍背靠Eclipse的Eclipse Vert.x是一个用于在JVM上构建响应式应用程序的工具包。定位上与SprintBoot不冲突,甚至可以将Vert.x结
1. final的关键字提高了性能,JVM和java应用会缓存final变量 2. final变量可以在多线程环境下保持线程安全 3. 使用final的关键字提
1.编译器优化 (包括 JVM,JI 编译器等) 2.CPU指令重排 3.内存的重排序 (可见性的问题,线程A 的修改 B却看不到) 1.单线程规则 2.锁操作
Java学习笔记,内容包括JVM,spring,hashMap实现内核分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从里面抽出,专门整了个面试的分类,如果是看面试的东西的话,可以重点看这个。 编码字...
Please see the JDK, JRE, and Plug-in 6.0.04 Release Notes' installation instructions for detailed installation instructions. Note: When downloading a .depot, .tar, or .sh file, some browsers don't ...
· · Java Series | Java 开发基础与工程实践Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言,Java 当初诞生的时候,正是上世纪 90 年代末互联网兴起的时代,在企业应用开发中存在几个问题...
Domino R8.0.x安装手册 for AIXV5R3,详细说明
learning-notes分布式1.Lambda表达式Java基础JVM设计模式数据库并发微服务消息队列1.RabbitMq缓存1.Redis集群方式(主从复制,哨兵模式和Redis-Cluster集群)2.Redis内存回收机制3.Redis笔记4.Redis Cluster原理5....
虽然 Java 应用程序及其编译的字节码被设计为不受硬件影响而运行,但 JVM 是专门为它所在的机器编写的,这意味着 JVM 是平台相关的,而不是用户应用程序。 由于程序由 JVM 而非主机解释,因此与 C/C++ 等语言(它们...
LearningNotes是一个Java学习笔记,主要来源于B站上视频的学习,同时会记录平时一些学习和项目中遇到的问题,同步更新在 蘑菇博客,如果对我的博客网站感兴趣的话,欢迎关注我的 蘑菇博客源码,如果笔记对您有帮助的...