运行时数据区
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
分享到:
相关推荐
- [JSTAT文档](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html) 以上介绍的各种JVM工具和参数对于Java开发人员来说是非常重要的,它们能够帮助我们更好地理解和管理JVM的行为,从而提高...
2. `MaxHeapSize`: 控制Java虚拟机(JVM)的最大内存分配,直接影响服务器的性能。 3. `AdminServer`: 指定管理服务器,用于执行后台任务和管理操作。 4. `WebServerPort`: 配置HTTP服务器的监听端口,对于Web访问至...
jmap -heap pid可以查看应用程序堆的信息jstat可以打印元空间信息MC :分配到元空间大小MU:已使用的元空间大小 元空间是可以自己扩容的元空间:
这是通过Java虚拟机(JVM)实现的,JVM将编译后的Java字节码转换为特定平台的机器指令。 #### 二、Java虚拟机(JVM) **2.1 什么是JVM?** JVM即Java虚拟机,是一个运行时环境,用于执行编译后的Java类文件。它...
查看厂商发布的Release Notes可以帮助判断版本的稳定性和已知的问题。 - **Oracle Java虚拟机**:包括原Sun Java虚拟机和BEA JRockit。这两个虚拟机都能在Windows、Linux、Solaris等平台上运行。Sun Java虚拟机历史...
【标签】"Interview Java Notes"进一步明确了这些文件的主要焦点,即与Java相关的面试准备,这可能包括但不限于语言特性、设计模式、框架应用、并发处理、内存管理等方面的知识。 【压缩包子文件的文件名称列表】:...
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 可以看jvm参数查看网址 Direct buffer memory : 直接内存太大(-XX:MaxDirectMemorySize=100m) Java heap space: 堆内存溢出 (-Xms30m -...
这份"JavaSE notes,笔记"包含了开发者在学习和实践JavaSE过程中的一些关键知识点和经验总结。 首先,JavaSE的核心是Java虚拟机(JVM),它是Java程序的运行环境。理解JVM的工作原理,包括类加载机制、内存模型(堆...
notes JVM: java虚拟机 一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 三:下篇——性能监控与调优篇 一: 上篇——内存与垃圾回收器 架构: jvm依赖的架构: 栈架构/寄存器架构 栈架构 JVM的生命周期: ...
Notes 我的笔记: 知识不总结,就会被大脑当垃圾清理 :horse:求知之路必然不会一帆风顺,唯有以勤为刃,以习惯为马,劈懒斩愚,跨越舒适区,方能知众人所不知,晓众人所不晓。 :person_walking:勤于思考的人,就算散步...
总结,"Core Java notes"涵盖了Java语言的核心概念,从基本语法到面向对象特性,再到高级主题如多线程和集合框架。理解并熟练掌握这些知识对于任何Java开发者来说都是至关重要的。通过深入学习和实践,可以提升编程...
【java开发笔记指北】涵盖java、JVM、Spring、常用框架、中间件、数据库、数据结构与算法_study-notes
Java程序由类组成,通过类加载器加载到Java虚拟机(JVM)上执行。 二、Java语法 Java的语法与C++类似,但更简洁。它包含变量声明、数据类型(如整型、浮点型、字符型、布尔型)、运算符、控制结构(如if语句、for循环...
loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 常用设计模式 单例模式 , 工厂模式 , 装饰者模式 , 代理...
在安装之前,你需要在Linux系统上安装Java虚拟机(JVM),这是Lotus Domino运行的基础。通常,我们会将安装文件拷贝到 `/usr/src` 目录下,但你也可以选择其他位置。通过命令 `rpm -ivh compat-libstdc++-8-3.3.4.2....
Java Runtime Environment,简称JRE,是运行Java应用程序的环境,包含Java虚拟机(JVM)、Java类库和其他支持文件。任何想要在计算机上运行Java程序的用户都必须安装JRE。 ### Java 6.0:历史与重要性 Java 6.0,...
它的设计目标是具有“写一次,到处运行”的特性,通过Java虚拟机(JVM)在不同平台上运行。Java的特点包括简单性、面向对象、健壮性、安全性以及高性能,使其在软件开发、移动应用、企业级应用等领域广泛应用。 在...
源代码首先被编译器编译成字节码(`.class`文件),这些字节码再由Java虚拟机(JVM)解释执行。这种机制使得Java具有较好的跨平台特性。 - **指针与内存管理**:Java对指针进行了高级封装,称之为引用。通过引用...
综上所述,这些学习笔记涵盖了软件开发中的多个核心领域,从基础的编程语言到Web开发,再到系统层面的操作系统和网络,以及深入的JVM理解和数据结构学习。对于希望全面掌握IT技术的学者或开发者来说,这些都是必不可...
11. **JVM(Java Virtual Machine)**:Java的执行环境,包括类加载、字节码解释、垃圾回收等机制,了解JVM工作原理有助于优化程序性能。 12. **设计模式**:笔记可能涵盖了常见的设计模式,如单例、工厂、观察者、...