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

重庆制作网站培训简易签名设计一笔签

重庆制作网站培训,简易签名设计一笔签,学做土建资料员的网站,百度搜不到公司网站目录 System.gc()的理解 内存泄漏#xff08;Memory Leak#xff09; 内存溢出#xff08;OOM#xff09; Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下#…目录 System.gc()的理解 内存泄漏Memory Leak 内存溢出OOM Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下通过system.gc()或者Runtime.getRuntime().gc() 的调用会显式触发Full GC同时对老年代和新生代进行回收尝试释放被丢弃对象占用的内存。 然而System.gc() 调用附带一个免责声明无法保证对垃圾收集器的调用。(不能确保立即生效) JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下垃圾回收应该是自动进行的无须手动触发否则就太过于麻烦了。在一些特殊情况下如我们正在编写一个性能基准我们可以在运行之间调用System.gc() public class SystemGCTest {public static void main(String[] args) {new SystemGCTest();System.gc();// 提醒JVM的垃圾回收器执行gc但是不确定是否马上执行gc// 与Runtime.getRuntime().gc();的作用一样System.runFinalization();//强制执行使用引用的对象的finalize()方法} ​Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println(SystemGCTest 重写了finalize());} } 内存泄漏Memory Leak 也称作“存储渗漏”。严格来说只有对象不会再被程序用到了但是GC又不能回收他们的情况才叫内存泄漏。 但实际情况很多时候一些不太好的实践或疏忽会导致对象的生命周期变得很长甚至导致00M也可以叫做宽泛意义上的“内存泄漏”。 尽管内存泄漏并不会立刻引起程序崩溃但是一旦发生内存泄漏程序中的可用内存就会被逐步蚕食直至耗尽所有内存最终出现OutOfMemory异常导致程序崩溃。 注意这里的存储空间并不是指物理内存而是指虚拟内存大小这个虚拟内存大小取决于磁盘交换区设定的大小。 举例 1单例模式 单例的生命周期和应用程序是一样长的所以单例程序中如果持有对外部对象的引用的话那么这个外部对象是不能被回收的则会导致内存泄漏的产生。 2一些提供close的资源未关闭导致内存泄漏 数据库连接dataSourse.getConnection() 网络连接socket和io连接必须手动close否则是不能被回收的。 内存溢出OOM OutOfMemoryError的解释是没有空闲内存并且垃圾收集器进行垃圾回收也无法提供更多内存。 首先说没有空闲内存的情况说明Java虚拟机的堆内存不够。原因有二 1 Java虚拟机的堆内存设置不够。 比如可能存在内存泄漏问题也很有可能就是堆的大小不合理比如我们要处理比较可观的数据量但是没有显式指定JVM堆大小或者指定数值偏小。我们可以通过参数-Xms 、-Xmx来调整。 2 代码中创建了大量大对象并且长时间不能被垃圾收集器收集存在被引用 对于老版本的Oracle JDK因为永久代的大小是有限的并且JVM对永久代垃圾回收如常量池回收、卸载不再需要的类型非常不积极所以当我们不断添加新类型的时候永久代出现OutOfMemoryError也非常多见尤其是在运行时存在大量动态类型生成的场合类似intern字符串缓存占用太多空间也会导致OOM问题。对应的异常信息会标记出来和永久代相关“java.lang.OutOfMemoryError: PermGen space。 随着元数据区的引入方法区内存已经不再那么窘迫所以相应的OOM有所改观出现OOM异常信息则变成了“java.lang.OutofMemoryError:Metaspace。直接内存不足也会导致OOM。 这里面隐含着一层意思是在抛出OutOfMemoryError之前通常垃圾收集器会被触发尽其所能去清理出空间。 例如在引用机制分析中涉及到JVM会去尝试回收软引用指向的对象等。 在java.nio.BIts.reserveMemory()方法中我们能清楚的看到System.gc()会被调用以清理空间。 当然也不是在任何情况下垃圾收集器都会被触发的 比如我们去分配一个超大对象类似一个超大数组超过堆的最大值JVM可以判断出垃圾收集并不能解决这个问题所以直接抛出OutOfMemoryError。 Stop The World stop-the-World简称STW指的是GC事件发生过程中会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停没有任何响应有点像卡死的感觉这个停顿称为STW。 可达性分析算法中枚举根节点GC Roots会导致所有Java执行线程停顿。 分析工作必须在一个能确保一致性的快照中进行 一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上 如果出现分析过程中对象引用关系还在不断变化则分析结果的准确性无法保证 被STW中断的应用程序线程会在完成GC之后恢复频繁中断会让用户感觉像是网速不快造成电影卡带一样所以我们需要减少STW的发生。 STW事件和采用哪款GC无关所有的GC都有这个事件。 哪怕是G1也不能完全避免Stop-the-World情况发生只能说垃圾回收器越来越优秀回收效率越来越高尽可能地缩短了暂停时间。 STW是JVM在后台自动发起和自动完成的。在用户不可见的情况下把用户正常的工作线程全部停掉。 垃圾回收的串行、并行与并发 Java中的并行与并发 并行Parallelism指的是在同一时刻有多个线程或任务同时执行的能力。在计算机系统中通常指的是在多核处理器上同时执行多个线程或任务以提高系统的性能和效率。在Java中可以使用并行流Parallel Streams来实现并行处理数据流也可以使用线程池来创建多个线程并行执行任务。 并发Concurrency指的是在同一时间段内有多个线程在同一个处理器上执行的能力。在Java中可以使用多线程来实现并发编程实现多个任务的同时执行。并发编程需要考虑到线程间的通信和同步以避免竞态条件Race Condition等问题。 垃圾回收器中的并行与并发 并行Parallel 指多条垃圾收集线程并行工作但此时用户线程仍处于等待状态。如ParNew、Parallel Scavenge、Parallel Old 串行Serial 相较于并行的概念单线程执行。如果内存不够则程序暂停启动JM垃圾回收器进行垃圾回收。回收完再启动程序的线程。 并发Concurrent 指用户线程与垃圾收集线程同时执行但不一定是并行的可能会交替执行垃圾回收线程在执行时不会停顿用户程序的运行。用户程序在继续运行而垃圾收集程序线程运行于另一个CPU上如CMS、G1 安全点与安全区域 安全点 程序执行时并非在所有地方都能停顿下来开始GC只有在特定的位置才能停顿下来开始GC这些位置称为“安全点Safepoint”。 Safe Point的选择很重要如果太少可能导致GC等待的时间太长如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂通常会根据“是否具有让程序长时间执行的特征”为标准。比如选择一些执行时间较长的指令作为Safe Point如方法调用、循环跳转和异常跳转等。 如何在GC发生时检查所有线程都跑到最近的安全点停顿下来呢 抢先式中断目前没有虚拟机采用了 首先中断所有线程。如果还有线程不在安全点就恢复线程让线程跑到安全点。 主动式中断 设置一个中断标志各个线程运行到Safe Point的时候主动轮询这个标志如果中断标志为真则将自己进行中断挂起。有轮询的机制 安全区域 Safepoint 机制保证了程序执行时在不太长的时间内就会遇到可进入GC的Safepoint。但是程序“不执行”的时候呢例如线程处于Sleep 状态或Blocked 状态这时候线程无法响应JVM的中断请求“走”到安全点去中断挂起JVM也不太可能等待线程被唤醒。对于这种情况就需要安全区域Safe Region来解决。 安全区域是指在一段代码片段中对象的引用关系不会发生变化在这个区域中的任何位置开始GC都是安全的。我们也可以把Safe Region看做是被扩展了的Safepoint。 实际执行时 当线程运行到Safe Region的代码时首先标识已经进入了Safe Relgion如果这段时间内发生GCJVM会忽略标识为Safe Region状态的线程 当线程即将离开Safe Region时会检查JVM是否已经完成GC如果完成了则继续运行否则线程必须等待直到收到可以安全离开Safe Region的信号为止 强、软、弱、虚引用 在JDK1.2版之后Java对引用的概念进行了扩充将引用分为强引用Strong Reference、软引用Soft Reference、弱引用Weak Reference、虚引用Phantom Reference这4种引用强度依次逐渐减弱。 除强引用外其他3种引用均可以在java.lang.ref包中找到它们的身影。如下图显示了这3种引用类型对应的类开发人员可以在应用程序中直接使用它们。 Reference子类中只有终结器引用是包内可见的其他3种引用类型均为public可以在应用程序中直接使用 强引用StrongReference最传统的“引用”的定义是指在程序代码之中普遍存在的引用赋值即类似“Object obj new Object()”这种引用关系。无论任何情况下只要强引用关系还存在垃圾收集器就永远不会回收掉被引用的对象。 软引用SoftReference在系统将要发生内存溢出之前将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存才会回收掉被软应用关联的对象。 弱引用WeakReference被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时无论内存空间是否足够都会回收掉被弱引用关联的对象。 虚引用PhantomReference一个对象是否有虚引用的存在完全不会对其生存时间构成影响也无法通过虚引用来获得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 强、软、弱、虚引用 在JDK1.2版之后Java对引用的概念进行了扩充将引用分为强引用Strong Reference、软引用Soft Reference、弱引用Weak Reference、虚引用Phantom Reference这4种引用强度依次逐渐减弱。 除强引用外其他3种引用均可以在java.lang.ref包中找到它们的身影。如下图显示了这3种引用类型对应的类开发人员可以在应用程序中直接使用它们。 Reference子类中只有终结器引用是包内可见的其他3种引用类型均为public可以在应用程序中直接使用 强引用StrongReference最传统的“引用”的定义是指在程序代码之中普遍存在的引用赋值即类似“Object obj new Object()”这种引用关系。无论任何情况下只要强引用关系还存在垃圾收集器就永远不会回收掉被引用的对象。 软引用SoftReference在系统将要发生内存溢出之前将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存才会回收掉被软应用关联的对象。 弱引用WeakReference被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时无论内存空间是否足够都会回收掉被弱引用关联的对象。 虚引用PhantomReference一个对象是否有虚引用的存在完全不会对其生存时间构成影响也无法通过虚引用来获得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 强引用 在Java程序中最常见的引用类型是强引用普通系统99%以上都是强引用也就是我们最常见的普通对象引用也是默认的引用类型。 当在Java语言中使用new操作符创建一个新的对象并将其赋值给一个变量的时候这个变量就成为指向该对象的一个强引用。 强引用的对象是可触及的垃圾收集器就永远不会回收掉被引用的对象。 对于一个普通的对象如果没有其他的引用关系只要超过了引用的作用域或者显式地将相应强引用赋值为nu11就是可以当做垃圾被收集了当然具体回收时机还是要看垃圾收集策略。 相对的软引用、弱引用和虚引用的对象是软可触及、弱可触及和虚可触及的在一定条件下都是可以被回收的。所以强引用是造成Java内存泄漏的主要原因之一。 StringBuffer str new StringBuffer(hello); StringBuffer str1 str; 本例中的两个引用都是强引用强引用具备以下特点 强引用可以直接访问目标对象。 强引用所指向的对象在任何时候都不会被系统回收虚拟机宁愿抛出OOM异常也不会回收强引用所指向对象。 强引用可能导致内存泄漏。 软引用 软引用是用来描述一些还有用但非必需的对象。只被软引用关联着的对象在系统将要发生内存溢出异常前会把这些对象列进回收范围之中进行第二次回收如果这次回收还没有足够的内存才会抛出内存溢出异常。 软引用通常用来实现内存敏感的缓存。比如高速缓存就有用到软引用。如果还有空闲内存就可以暂时保留缓存当内存不足时清理掉这样就保证了使用缓存的同时不会耗尽内存。 垃圾回收器在某个时刻决定回收软可达的对象的时候会清理软引用并可选地把引用存放到一个引用队列Reference Queue。 类似弱引用只不过Java虚拟机会尽量让软引用的存活时间长一些迫不得已才清理。 在JDK1.2版之后提供了java.lang.ref.SoftReference类来实现软引用 Object obj new Object(); SoftReferenceObject sf new SoftReference(); obj null; 弱引用 弱引用也是用来描述那些非必需对象只被弱引用关联的对象只能生存到下一次垃圾收集发生为止。在系统GC时只要发现弱引用不管系统堆空间使用是否充足都会回收掉只被弱引用关联的对象。 但是由于垃圾回收器的线程通常优先级很低因此并不一定能很快地发现持有弱引用的对象。在这种情况下弱引用对象可以存在较长的时间。 弱引用和软引用一样在构造弱引用时也可以指定一个引用队列当弱引用对象被回收时就会加入指定的引用队列通过这个队列可以跟踪对象的回收情况。 软引用、弱引用都非常适合来保存那些可有可无的缓存数据。如果这么做当系统内存不足时这些缓存数据会被回收不会导致内存溢出。而当内存资源充足时这些缓存数据又可以存在相当长的时间从而起到加速系统的作用。 在JDK1.2版之后提供了WeakReference类来实现弱引用 Object obj new Object(); WeakReferenceObject sf new WeakReference(obj); obj null; 弱引用对象与软引用对象的最大不同就在于当GC在进行回收时需要通过算法检查是否回收软引用对象而对于弱引用对象GC总是进行回收。弱引用对象更容易、更快被GC回收。 比如可以用WeakHashMap用来存储图片信息可以在内存不足的时候及时回收避免了OOM ThreadLocalMap中的key就是弱引用。 虚引用 也称为“幽灵引用”或者“幻影引用”是所有引用类型中最弱的一个。 一个对象是否有虚引用的存在完全不会决定对象的生命周期。如果一个对象仅持有虚引用那么它和没有引用几乎是一样的随时都可能被垃圾回收器回收。 它不能单独使用也无法通过虚引用来获取被引用的对象。当试图通过虚引用的get()方法取得对象时总是null 为一个对象设置虚引用关联的唯一目的在于跟踪垃圾回收过程。比如能在这个对象被收集器回收时收到一个系统通知。 虚引用必须和引用队列一起使用。虚引用在创建时必须提供一个引用队列作为参数。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象后将这个虚引用加入引用队列以通知应用程序对象的回收情况。 由于虚引用可以跟踪对象的回收时间因此也可以将一些资源释放操作放置在虚引用中执行和记录。 在JDK1.2版之后提供了PhantomReference类来实现虚引用。 Object obj new Object(); ReferenceQueue phantomQueue new ReferenceQueue(); PhantomReferenceObject sf new PhantomReference(obj, phantomQueue); obj null; 终结器引用 它用于实现对象的finalize() 方法也可以称为终结器引用。无需手动编码其内部配合引用队列使用。 在GC时终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象调用它的finalize()方法第二次GC时才回收被引用的对象
http://www.zqtcl.cn/news/359624/

相关文章:

  • 金华市金东区建设局网站wordpress好看的下载页面
  • 英文网站seo发展前景成都网站开发建设推广
  • p2p网贷网站建设方案制作网站专业公司吗
  • 益阳网站建设企业房地产市场最新动态
  • 关于公司网站改版通知jmr119色带
  • 城关区建设局网站珠海中英文网站建设
  • 长春哪家做网站便宜手机英语网站
  • 应城网站建设莱芜拉呱
  • 如何建立淘宝客网站HTML网站建设课程
  • 网站建设供需chrome不安全的网站设置
  • 网站dns修改中国楼市未来发展趋势
  • 网站超级链接怎么做帮别人发广告赚钱平台
  • 做网站可以赚钱么注册做网站的公司
  • 河南省建协网官方网站建网站卖阀门
  • 医院网站怎么制作重庆安全监督工程信息网
  • 饰品网站建设规划书搭建微信网站
  • 开发网站访问流量赚钱加盟网站需要怎么做
  • 装饰协会网站源码湖南省郴州市北湖区
  • 花都网站建设价格重庆市住房和城乡建设厅网站
  • 北京住总第一开发建设有限公司网站wordpress 网站访问认证页面
  • 网站制作的管理苏州百度推广服务中心
  • 厦门建行网站首页企业展厅建筑外观
  • 重庆定制型网站建设1000套网站源码
  • 阿里云网站建设服务费会计科目安平县建设局网站
  • 网上做国外兼职网站网络编程技术实验报告
  • iis网站服务器安全隐患分析创新的合肥网站建设
  • 蛋糕网站建设方案广州网站公司推荐
  • 无锡seo公司网站广渠门做网站的公司
  • 安徽股票配资网站建设seo教程自学网
  • 网站建设酷隆做3d建模贴图找哪个网站