版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37933685/article/details/80617250
个人博客:https://suveng.github.io/blog/
2004.9 jdk1.5 tiger 自动装箱拆箱,泛型,,注解,枚举,变长参数,增强for循环 spring2.x spring4.x
2006 jdk1.6 javaee Javase Javame jdk6
2009 jdk1.7 收购sun 74亿
2014 jdk1.8
2017 jdk1.9
2018 jdk10
Java程序设计语言
java 虚拟机
class 类文件格式
Java API
第三方Java类库
jconsole.exe
在jdk/bin目录下,双击打开可运行,监控吗某个Java程序的状态
编写测试类观察jvm内存
JconsoleTest.java
package jconsole;
import java.util.ArrayList;
import java.util.List;
/**
* @author Veng Su 1344114844@qq.com
* @date 2018/4/29 11:28
*/
public class JconsoleTest {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
fill(1000);
}
private static void fill(int n) throws InterruptedException {
List<JconsoleTest> jconsoleTests =new ArrayList<JconsoleTest>();
for (int i=0;i<n;i++){
Thread.sleep(200);
jconsoleTests.add(new JconsoleTest());
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @author Veng Su 1344114844@qq.com
* @date 2018/4/29 10:39
*/
public class Main {
public static void main(String[] args) {
// 测试堆内存溢出
List<Demo> demoList=new ArrayList<Demo>();
while (true){
demoList.add(new Demo());
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @author Veng Su 1344114844@qq.com
* @date 2018/4/29 10:39
*/
public class Main {
public static void main(String[] args) {
// 测试堆内存溢出
List<Demo> demoList=new ArrayList<Demo>();
while (true){
demoList.add(new Demo());
}
}
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at Main.main(Main.java:13)
-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m
运行时常量池
存放方法运行时所需的数据,称为栈帧
为jvm调用到的native,即本地方法服务
记录当前线程执行到字节码的行号
Java虚拟机栈为虚拟机执行Java方法服务
本地方法栈为虚拟机执行native方法服务
存放对象实例
垃圾搜集器管理的主要区域
新生代,老年代,Eden空间
申请不到空间同样抛出outofmemoryerror
存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码等数据
类信息:
类的版本
字段
方法
接口
方法区和永久代 Hotspot使用永久代实现方法区,两者不等价
垃圾回收在方法区的行为
异常的定义
申请空间失败抛出outofmemoryerror
常量池相当于一个hashset存放这写常量,
而new 出来的实例肯定是放到堆内存中去
运行时常量和字节码常量的区别,运行时创建的常量和编译期创建的常量的区别
给对象分配内存的方法
可能会出现线程安全性问题
如何解决
线程同步 缺点:效率低
本地分配缓冲
其他虚拟机
Sun hotshot
Bea JRockit
IBM J9
1. 标记-清除算法 效率问题
空间问题
2. 复制算法 堆
1. 新生代
1. Eden 伊甸园
2. survivor 存活区
3. Tenured Gen
2. 老年代
虚拟机栈
本地方法栈
程序计数器
1. 标记-整理-清除算法 针对老年代
2. 分代收集算法
1. Serial 单线程
2. Parnew
3. parallel scanvenge收集器 -XX:MaxGFPauseMillis 垃圾收集器停顿时间1
-XX:CGTimeRatio 吞吐量大小
复制算法(新生代收集器)
多线程收集器
达到可控吞吐量
吞吐量:CPU运行代码的时间与CPU消耗的总时间的比值
4. CMS收集器 current Mark sweep
1. 工作过程
1. 初始标记
2. 并发标记
3. 重新标记
4. 并发清理
2. 优点
1. 并发收集
2. 低停顿
3. 缺点
1. 占用大量CPU资源
2. 无法处理浮动垃圾
3. 出现current mode failure
4. 空间碎片
5. G1
只要电脑运行内存大于2g,CPU核心是多核, 默认是ServerVM
可以看到我们的虚拟机是HotSpot
1. 没添加option的时候,默认列出VM标示符号和简单的class或jar名称
2. -p :仅仅显示VM 标示,不显示jar,class, main参数等信息.
3. -m:输出主函数传入的参数. 下的hello 就是在执行程序时从命令行输入的参数
4. -l: 输出应用程序主类完整package名称或jar完整名称.
5. -v: 列出jvm参数, -Xms20m -Xmx50m是启动程序指定的jvm参数
6. -V: 输出通过.hotsportrc或-XX:Flags=指定的jvm参数
7. -Joption:传递参数到javac 调用的java lancher.JSTAT
jstat命令可以类装载,内存,垃圾收集,jit编译。命令的格式如下:
jstat -命令选项 间隔时间/毫秒
1. 类加载统计
2. 编译统计
3. 垃圾回收统计
4. 新生代垃圾回收统计
5. 新生代内存统计
6. 老年代垃圾回收统计
7. 老年代内存统计
8. 元数据空间统计
9. 总结垃圾回收统计
10. JVM编译方法统计
jinfo -flags process_id
查看java系统参数
jinfo -sysprops process_id
XX:+HeapDumpOnOutOfMemoryError
参数来让虚拟机出现OOM的时候自动生成dump文件。
参数 option:选项参数,不可同时使用多个选项参数 pid:java进程id,命令ps -ef | grep java获取 executable:产生核心dump的java可执行文件 core:需要打印配置信息的核心文件 remote-hostname-or-ip:远程调试的主机名或ip server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器 options参数 heap : 显示Java堆详细信息 histo : 显示堆中对象的统计信息 permstat :Java堆内存的永久保存区域的类加载器的统计信息 finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象 dump : 生成堆转储快照 F : 当-dump没有响应时,强制生成dump快照
-dump dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
-heap 打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
-finalizerinfo 打印等待回收的对象信息,
-histo 打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息 jmap -histo:live 24971 | grep com.yuhuo 查询类名包含com.yuhuo的信息 jmap -histo:live 24971 | grep com.yuhuo > histo.txt 保存信息到histo.txt文件
-permstat 打印Java堆内存的永久区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
-F 强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。1. 优化sql
2. 监控CPU
3. 监控内存
- FULL GC 垃圾收集时间过长
- 解决方案
- 调整堆内存大小
问题:
处理思路: