JVM基础

一、JVM结构
classLoader加载到内存中
class不是cpu能够直接解释的文件  --->本地代码

hotspot  技术:热点探测  解决性能问题   jdk1.5后
对频繁编译的代码,存储成本地编译  类似缓存

虚拟机在启动时,准备两个版本  client  server
client  桌面级应用虚拟机  代码量不大  而bs可以并发  线程数多
把堆里面的内存分的比较小  可以提升效率   默认启用client端


server:空间会浪费

1.1、JVM总体结构



class文件中的字节被保存起来。放在方法区中。方法区肯呢过存放运行时的常量池信息,
放唯一的东西。

垃圾回收系统
java堆

java栈:保存帧信息
native method:本地方法 java需要调用本地系统的API
  不同的操作系统API不一样  所以有不同的版本的jvm'


不分代
产生碎片,对内存早成浪费。回收的200k,来了300k就会存不进去,只能往后找大于300k的内存空间。
垃圾回收会更加复杂

分块


分代垃圾搜集

阈值是15  from  to
么偶超过15的到to  from清空



二、JVM垃圾回收算法及收集器

对象做了计数器

也就是新生区和suivior区域

红色--空
绿 生命长  需要被复制的对象    
蓝色  没被使用的空间  灰即将被回收的对象    
最后彻底清空

创建开始做标志
此算法需要暂停整个应用 stop the world   后续是对此缺点的优化



是对标志-清除算法的一个优化
重点  复制  标志清除  标志整理

垃圾收集器
垃圾收集算法是垃圾收集器的方法论,垃圾收集器就是对该方法的具体实现。

scavenge  清除  到扫

根据sca无法触发的时候出发full gc
只要进行full gc 前面一定进行了majior gc



暂停所有的工作线程。

优化的点
选择jvm的版本 client  server
对于堆区大小的分配
垃圾收集器的选择

CMS较好的收集器 只能neg和serial或parnew(默认)搭配使用

多核cpu下更优,配合超线程技术。(单核模拟多核)
服务器可以插多个cpu。物理节点。
 
多核下才能显示出优势
是jvm实现了减少stw的时间。

解决系统吞吐量的问题。parnew不考虑吞吐量,只考虑用户线程等待时间。
 
serial的老年版
不能用复制算法了  而是标志整理算法

新老有搭配



并行:gc可以多线程的形式运行  parallerlxxx不能和用户线程同时运行的
并发:我的垃圾线程和用户的线程同时(交替)运行。

cms也是一个优化点。注意组合。





在jdk的安装bin目录下
jps  对jvm附注检测的小工具  类似linux中的ps  显示进程信息
tomcat依赖于虚拟机
在jps -l  显示jvm中的线程
jstat-------

jstat -gc 10340(pid) 250毫秒 20 输出次数
s0c suvior分配空间的大小  字节单位  20736、2k多   s0create
s1c suvior分配空间的大小  字节单位
s0U  用的空间  
s1U  0 没有可回收的
EC  eden区  
EU  用了的
OC  老年代大小
OU  老年代用了多少
PC  持久代
PU  持久代用了多少
YGC  次收集器收集的次数  12  收了12次
YGCT  时间  s  
FGC Full gc  回收的次数
GCT   (年轻代)次收集器和老年代总的收集时间

 


javaVisualVM

是tomcat启动后会去启动jvm-->启动后设定一些参数进行优化
这是我们自己去run虚拟机
tomcat启动的时候,我们没办法去run虚拟机。要tomcat去设置jvm的启动项。读配置文件的方式。


可以扩展插件.visualGC

可以靠这些检测的参数来对jvm进行优化。

堆包含了eden包含了old  整个堆的

  --垃圾回收统计信息
SurvivorRatio  so、s1相对于eden的大小。

public class demo01 {
    public static void main(String[] args) {
        List<GarbageCollectorMXBean> list = ManagementFactory.getGarbageCollectorMXBeans();
        for(GarbageCollectorMXBean b:list) {
            System.out.println(b.getName());  //年轻代 老年代
        }
    }
}
获取gc名称

PS Scavenge  年轻代
PS MarkSweep  老年代

jvm启动给定的  run configurations
空格分隔


堆的大小在32系统下最大不能超过2G
64不能超过物理内存的限制

栈溢出和此设置有关
除非是递归很长,复杂的数学运算。。。等情况

垃圾最大年龄  和阈值有关





 

posted @ 2019-01-13 17:32  payn  阅读(193)  评论(0)    收藏  举报