/**
* 高并发拆分原则
* 任务的性质:CPU任务,IO任务
* 并发数量:
* 执行时间
* 任务优先级
* 依赖性
* 资源性质
* 业务耦合度
*
* 自定义线程池继承ThreadPoolExecutor类,实现方法
*
*/
System.out.println('a');
/*
* jvm内存结构
* 1、程序计数器
* 当前线程所执行的字节码的行号指示器
* 字节码解析器通过改变程序计数器的值来选取下一条需要执行的字节码指令
* 确保线程切换后能恢复到正确的执行位置,每个线程有独立的程序计数器
* 程序计数器是线程私有的内存
* 是唯一个没有规定任何内存溢出的内存区域
* 2、jvm栈
* 线程私有
* 生命周期与线程相同
* 描述java方法执行的内存模型
* 方法执行时会创建栈帧来存放方法的信息和数据
* 栈帧中的局部变量表是在编译期间完成分配的
* 当请求深度大于jvm允许的足底啊深度时,StackOverflowError
* jvm栈可以动态扩展,无法申请到足够内存时,OutOfMemoryError
* 3、本地方方法栈
* 为jvm调用操作系统本地方法服务的
* 4、共享堆
* jvm中内存区域最大一块
* 被所有线程共享
* jvm启动是创建,存放对象实例
* gc主要管理区域
* 物理不连续,逻辑连续
* 无法扩展时,OutOfMemoryError
* 5、方法区
* 线程共享
* 存储jvm加载的类信息、常量、静态变量、编译后的代码等数据
* 堆的一个逻辑部分
* 也叫做非堆 Non-Heap,永久代
* 最终要的部分是运行时常量池
*
*
*
* 程序计数器、虚拟机栈、本地方法栈 跟线程的生命周期相同,分配和回收是确定的
*
* 堆内存和方法区是通过垃圾回收机制的三代关系来完成的
*
* jvm的垃圾回收机制
* jvm堆和非堆分为三个代
* 年轻代 yong generation :主要是动态的存储
* eden区和两个相同的survior区
* 刚开始创建的对象都是放置在eden区
* 主要是为了生命周期段的对象尽量留在年轻代
* 当eden申请不到空间的时候,进行minorGC,把存活的对象拷贝到survior
*
* 年老代
* 永久带permanent generation:方法区,主要存储java的类信息等,基本不参于垃圾回收
*
*
*
* MinorGC:年轻代gc,非常频繁,回收速度快
* majorGC:年老代gc,发生时,至少一次minorgc,速度慢
* FullGC:整个堆内存进行的gc,很多时候是majorGC
*
* majorGC和fullgc 最耗cpu,影响程序的响应,需要合理设置年轻和年老大小
*
*
*
* 回收过程
* 对象在Eden区完成内存分配
* Eden区满了,创建对象申请不到空间,触发minorGC进行垃圾回收(young eden 和survivor)
* minorGC时,eden会被清空,不会回收的会被放到survivor,另一个survivor不能被回收的对象也会放到这里
* 始终保持一个survicor是空的,survicor满时,里面的对象被copy到old区,或者对象足够old是,也会被放到old区
* old满时,进行fullGC
*
*
*
* 主要回收机制
* 串行收集器:单线程回收,效率高
* 并行收集器:多线程,减少回收时间
* 并发收集器:并发进行,gc暂停很少的时间,响应快
*
*
*
* 常见的内存溢出的三种情况
* OutOfMemoryError:
* java heap space
* 查看gc占用的时间,手动设置heap的大小
*
* permgen space
* 内存永久保存区域
* 存放的是class和meta信息
* 类load的时候放入
* gc不会清理
* 一般发生在启动阶段
* 设置MaxPermSize大小
*
* thread stack space
* 构造函数层太多,栈溢出
* 设置每个线程的Stack
*
*
*
* 知道了这些了
* jvm调优应该知道怎么办了
* 想仔细了解的话
* 待我再找本书
*
*
* -Xms:java heap 初始大小 默认物理内存的1/64
* -Xmx:ava heap 最大值, 不可超过物理内存
* -Xmn :young generation 的heap大小 Xmx的1/3或4/1 ,年轻代增加 ,年老减小
* -Xss:每个线程的Stck,128kb最佳,
* -XX:permsize 永久保存区初始大小
* -XX:MaxPermSize
* -XX:SurvivorRatio: eden区和survivor比值 8 两个survivor与一个eden区的比值为2:8,一个survivor占年轻代的1/10
*
* java基础的监控工具
* bin/jvisualvm
*
* java性能分析器
* jconsole
*
*
*压测工具
* badboy
* jmeter
*
*
* MutithreadedTc 测试并发jar
*
*/
jvm性能调优、压测有待学习