当前位置: 首页 > news >正文

医院网站设计方案高唐做网站推广

医院网站设计方案,高唐做网站推广,做今网站,wordpress添加注册页面引言 什么是JVM 定义: Java VirtualMachine -java 程序的运行环境 (ava 二进制字节码的运行环境) 好处: 一次编写#xff0c;到处运行自动内存管理#xff0c;垃圾回收功能数组下标越界检查#xff0c;多态 比较: jvm jre jdk 学习jvm的作用 面试理解底层实现原理中…引言 什么是JVM 定义: Java VirtualMachine -java 程序的运行环境 (ava 二进制字节码的运行环境) 好处: 一次编写到处运行自动内存管理垃圾回收功能数组下标越界检查多态 比较: jvm jre jdk 学习jvm的作用 面试理解底层实现原理中高级程序员的必备技能 常见的jvm 自己百度查找 jvm的组成 内存结构 程序计数器 定义 Program Counter Register 程序计数器(寄存器) 作用 如下图所示 右边就是简单的java代码打印操作编译成左侧的二进制字节码。 经过解释器——机器码——CPU执行。 程序计数器在这里面的作用就是记住下一条jvm指令的执行地址。 第一条指令地址是0第一条指令交给解释器去执行的同时会把第二条指令的地址3放入程序计数器。第一条执行完之后解释器会去取出3来执行...... 物理实现: 通过CPU中寄存器(速度快)实现 特点: 线程私有 每个线程都有自己的程序计数器。 每一个线程会有被分配一个时间片在当前时间片内不能执行完会去执行别的线程的代码直到轮到下一个时间片。 切换到别的线程时要记住当前执行到哪里还是要用到程序计数器。通过私有的程序计数器知道下一行代码的地址。 唯一不会存在内存溢出的区 虚拟机栈 栈是一种普通的先进后出的数据结构。 java的虚拟机栈则是线程运行需要的内存空间。 一段代码有多个方法组成一个栈帧表示一次方法的调用栈帧就是每个方法运行需要的内存。 运行:调用第一个方法时会给第一个方法划分一个栈帧空间并压入栈内执行完后会出栈也会释放该方法占用的内存。 然后方法1调用方法2时会产生一个方法2的栈帧并入栈然后方法2调用方法3也会产生并入栈如下图所示。 定义 Java Virtual Machine Stacks (Java 虚拟机栈) 每个线程运行时所需要的内存称为虚拟机栈每个栈由多个栈帧 (Frame) 组成对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧对应着当前正在执行的那个方法  栈帧大小由方法里的参数以及局部变量的个数决定  问题辨析 1.垃圾回收是否涉及栈内存? 栈内存是一次次方法调用产生的栈帧内存调用结束后会弹出栈会自动回收不需要垃圾回收     管理垃圾回收是回收堆内存中的无用对象。 2.栈内存分配越大越好吗? 运行java代码时是可以指定栈内存大小的使用-Xss size下图还有不同系统下默认栈内存的大小和设定内存的示例。 栈内存越大会让线程数变少512mb的物理内存下每个线程的栈内存设置1mb大小可以运行512个设置2mb大小可以运行256个线程。不会提高线程效率但可以增加递归的层数。 3.方法内的局部变量是否线程安全? 根据该变量是每个线程共享还是线程私有判断。下图是一个方法方法内有一个局部变量。 该方法被调用两次时会有两个不同的栈。每个线程都会有私有的局部变量。因此这里不会有线程干扰的问题。 假如将x改为static int x0;的话就会出现线程干扰如果不加保护的话会有线程安全问题。 总结共享需要考虑线程安全私有就不需要考虑。 如果方法内的局部变量没有逃离方法的作用范围则是线程安全。如果是局部变量引用了对象并逃离方法的作用方法需要考虑线程安全引用传递和值传递的问题 栈内存溢出 栈帧过多导致栈内存溢出栈帧过多爆栈  :  通常在的递归导致。单片栈帧过大导致栈内存溢出太大了已经塞满了 一般不会有单片过大栈帧里都是方法参数和局部变量。可以通过设置栈内存大小达到 在将对象转换成json对象时也会有栈溢出这种两个类的循环问题会导致json解释器出现问题。 可以通过一个JsonIgnore注解达到在json转换对象时忽略变量的效果。  线程运行诊断 案例1: cpu 占用过多 linux环境下运行一段java代码导致cpu占用过高可以使用top命令定位到哪一个进程占用但看不见是哪一个线程导致的。 在linux下使用ps H -eo pid,tid,%cpu 命令可以看见所有线程的pid(进程号),tid(线程号)%cpucpu占用。 使用ps H -eo pid,tid,%cpu | grep 32655   后面加上| grep pid过滤无关进程的线程。 用top定位哪个进程对cpu的占用过高ps H -eo pid,tid,%cpu | grep pid (用ps命令进一步定位是哪个线程引起的cpu占用过高)jstack 进程id  (可以根据线程id 找到有问题的线程进一步定位到问题代码的源码行号) 生产环境不推荐jstack因为打印线程信息jvm会暂停其他线程  然后将线程编号32665转换成16进制(7F99)在输出内容中查找  在jstack 输出内容中可以看见一个nidOx7f99的线程状态为RUNNABLE. 看见问题出在第8行代码。如下图源码第8行是个死循环。 nid、pid 和 tid 是计算机系统中常用的三个标识 nid (Node ID) 是指在分布式系统中每个节点的唯一标识pid (Process ID) 是指操作系统中每个进程的唯一标识。tid (Thread ID) 是指操作系统中每个线程的唯一标识。 案例2: 程序运行很长时间没有结果 线程死锁导致的无结果下使用jstack命令查看下输出内容最后可以看见有关死锁信息。 两个线程都想获得ab,但是都在等对方放开拥有的对象然后陷入死锁。 产生死锁的四个必要条件互斥、不可剥夺、请求和保持、循环等待。 本地方法栈 定义:    java虚拟机在调用本地方法时需要给本地方法提供的内存空间 在Object这个类中就有很多比如Object的clone方法的声明是native这个native的实现是c/cjava代码是间接调用native 堆 定义 通过 new 关键字创建对象都会使用堆内存 特点: 它是线程共享的堆中对象都需要考虑线程安全的问题有垃圾回收机制 (不再被引用的对象会被回收)  堆内存溢出 下图所示方法中String类型的对象a会一次次变大直至堆溢出。 运行结果:  溢出内存错误: java 堆 空间 使用-Xmx size改变堆空间大小。 修改前26次才溢出修改后17次溢出。 有可能堆内存较大运行时间短在系统前期看不出问题后期才会爆掉故测试时可以将堆内存设置较小进行排查。 堆内存诊断 相关工具: 1.jps 工具 查看当前系统中有哪些 java 进程 2. jmap 工具 查看堆内存占用情况 jmap -heap 进程id (只能看某一瞬间的情况) 3.jconsole 工具  图形界面的多功能的监测工具可以连续监测 4.jvisualVM 工具 图形化界面可以抓取当前快照  案例1 new一个10MB的数组对象后面置为null,然后gc显式回收。 运行后通过jps查看进程id,jmap -heap 18756在1~2,2~33之后三个时间点抓取快照信息。  最大堆内存占用MaxHeapSize是4个G  Eden Space就是专门为new 出来的对象准备的。  1~2之间 数组创建之前使用了6Mb 2~3之间 创建数组对象之后使用16mb, 3之后 垃圾回收之后变成1.2mb 使用jconsole工具的界面。 案例2 垃圾回收之后内存占用任然很高。 新生代被回收了老年代没有被回收。 新生代剩8mb 老年代剩200mb 使用新的工具jvisualvm可视化虚拟机 保存快照之后进行查找最大的类  查看最大的ArrayList实例的具体信息 源代码 两百个Student对象每个都开了一个1mb大小的byte数组。并且一直在作用范围内无法回收内存占用居高不下。 通过可视化界面的堆 dump按钮进行排查。  方法区 定义 按照jdk_jvm_1.8中的定义 方法区是所有java虚拟区线程共享的区域。存储了和类的结构相关的信息。有成员变量filed,method data方法数据成员方法、构造器方法的代码以及运行时常量值run-time constant pool等等在虚拟机启动时被创建逻辑上是堆的组成部分1.8以前用的堆内存1.8以后用的是系统内存方法区也会导致内存溢出 组成 永久代和元空间都是方法区这个概念的实现。 永久代和元空间最本质的区别就是 前者使用的是jvm内存 后者使用的是操作系统内存。 图中常量池是运行时常量池。 方法区内存溢出 1.8 以前会导致永久代内存溢出1.8 之后会导致元空间内存溢出 下图代码就是一个加载了10000个类的代码最外层继承实现了类加载器在循环内指定版本号类名包名父类接口等信息创建一个新类。 这里元空间和永久代都没有设置上限这里需要设置元空间和永久代大小。 -XX:MaxMetaspaceSize8m  元空间 -XX:MaxPermSize8m  永久代 元空间运行报异常  永久代报异常 场景: springmybatis spring和mybatis都使用到了cglib技术。 运行时常量池 下面的这段代码的二进制字节码含有如下信息。  使用如下命令查看该代码反编译后的结果 javap -v HelloWorld.class 常量池部分 虚拟机指令部分 执行指令时下面第一条就是获取静态变量#2在常量池里面找。 ldc是找到一个引用地址。 定义: 常量池就是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息运行时常量池常量池是*.class 文件中的当该类被加载它的常量池信息就会放入运行时常量池并把里面的符号地址变为真实地址 运行时常量池里面#1#2...这些会变成内存地址。
http://www.hkea.cn/news/14404238/

相关文章:

  • 红色系列的网站旅游网站开发技术文档
  • 网站建设与管理维护参考文献国产在线免费观看高甜电影推荐
  • 沈阳做网站哪家便宜安卓软件开发需要学什么
  • 哪些专业能建网站排名前50名免费的网站
  • 网站建设硬件需求坂田做网站
  • 淳安网站建设制作网站建设需要注册什么类型的公司
  • 做橙光游戏的网站专题型定制网站建设
  • 17858833595做网站软件开发项目经理职责
  • shopify网站建设页面设置怎么设置
  • 怎样才能做好网站优化网站建设中间件收费
  • 宁波网站建设制作订做建设邯郸网站
  • visual studio制作网站开发优秀网站大全
  • 江西恒通建设工程有限公司网站深圳云购网站制作
  • 深圳网站建设公司为什公司网站建设合同 华律网
  • 史家小学网站建设网站素材资源
  • 网站建设与网页制作技术绍兴seo全网营销
  • 成都做seo网站公司建设银行信用卡被钓鱼网站
  • 购物网站制作公司搜狗优化好的网站
  • 怎么知道网站关键词的搜索来源如何做h5简历制作网站
  • 黄冈网站建设哪家便宜网络营销大赛策划书
  • 定制高端网站建设怎么在百度首页做网站
  • 廊坊百度推广网站设计wordpress 上帝模式
  • 视频网站开发技术书美食网站开发与研究 论文
  • 公司建立网站的费用如何做帐微信支付需要网站备案
  • 简单网站建设哪家便宜四川省工程建设信息网
  • 网站f式布局网站开发工作室策划案
  • 东莞网站关键词我的世界电影怎么做的视频网站
  • 苏州招聘网站制作在大学里网站建设属于什么专业
  • 我们的优势的网站高端医疗网站建设
  • 可以做cps合作的棋牌网站北京网站设计外包公司价格