java VM学习
- 格式:docx
- 大小:17.76 KB
- 文档页数:2
java 虚拟机规范Java虚拟机规范(Java Virtual Machine Specification)是由Java语言设计者为了保证Java程序在任何平台上都能够运行,而定义的虚拟机的行为规范。
本文将详细介绍Java虚拟机规范,内容约1000字。
Java虚拟机规范定义了Java虚拟机(JVM)的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
通过遵循这些规范,开发者可以编写出具有良好可移植性和跨平台性的Java程序。
首先,Java虚拟机规范定义了JVM的结构。
JVM由类加载器、运行时数据区域、执行引擎和本地方法接口等组成。
类加载器负责加载类文件,并进行验证、解析和初始化。
运行时数据区域则包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器等。
执行引擎根据操作码执行相应的指令,并对操作数栈和局部变量表进行操作。
本地方法接口则是Java虚拟机与本地操作系统的接口。
其次,Java虚拟机规范定义了JVM的指令集。
指令集包括了加载、存储、算术运算、类型转换、比较和控制流等各种指令。
每个指令都对应了Java虚拟机的一种行为,可以通过指定操作数来执行相应的操作。
Java虚拟机规范还定义了JVM的运行时数据区域。
运行时数据区域包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器。
方法区用于存储类的结构信息、常量池、静态变量和方法等。
堆用于存储对象实例和数组。
虚拟机栈用于存储方法调用的局部变量表、操作数栈、动态链接和方法返回值等。
本地方法栈用于支持本地方法的调用。
程序计数器则用于记录当前线程执行的字节码指令地址。
此外,Java虚拟机规范还定义了JVM的内存管理、异常处理、线程和同步等方面的规范。
内存管理包括了垃圾收集和内存分配等。
异常处理定义了异常的分类、异常的处理流程和异常的处理方式。
线程规范包括了线程的创建、启动、执行和销毁等。
同步规范则定义了同步的机制和语义。
总结起来,Java虚拟机规范定义了Java虚拟机的行为规范,包括了JVM的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
竭诚为您提供优质文档/双击可除java,vm模板篇一:模板生成代码模块1.1代码生成此开发是一种基于mVc模式的新型web应用框架结构,将web应用分为视图层、控制层、模型层,每一层都有明确分工,层次清晰,结构明显。
在各层中,将大量的通用操作封装在抽象类中,具体业务对象继承抽象类实现功能,使代码更为简洁、清晰。
这样,涉及到业务对象的代码,应用Velocity模板引擎。
Velocitytemplatelanguage(Vtl)即模板语言,它可以引用java中的变量,引用java中某一对象的属性,如$customer.address,它可以表示:查找hashtable对象customer中以address为关键字的值;也可以表示调用customer对象的getaddress()方法,一个方法就是被定义在java中的一段代码,并且它有完成某些有用工作的能力,引用方法,如$customer.getaddress()。
Vtl汲取java语法和javabean的一些简洁语法以解析java代码中context中的对象和这些对象的命令及属性,这样,使用模板语言来引用由java代码定义的对象,就可以自动生成代码,进一步减少重复性代码的编码量。
代码生成的结构如下:1.1.1控制类代码生成1.1.1.1java变量生成在代码中生成的变量分为3种,基本类型数据变量,复杂类型数据变量和控件变量。
基本类型变量,诸如int,short,long,double,只要获取变量类型、变量名和变量值就能完成它们的初始化并赋值的代码。
将下面这行代码加入data.vm模板:private$datatype$dataname=$datavalue;保存data.vm,然后新建一个data.java文件,代码如下:publicstaticvoidmain(string[]args)throwsexception{ /*首先初始化模板引擎*/Velocity.init();/*接着,获得一个模板*/templatetemplate=Velocity.gettemplate("data.vm");/*创建上下文,填充数据*/Velocitycontextcontext=newVelocitycontext();context .put("datatype","int");context.put("dataname","result");context.put("datavalue","5");/*现在,把模板和数据合并,输出到stringwriter*/stringwriterwriter=newstringwriter(); template.merge(context,writer);/*显示结果*/ system.out.println(writer.tostring());}}当模板和数据合并后,data.vm中的$datatype就获取值int,$dataname获取值result,$datavalue就获取值5,故运行后就看到输出:intresult=5;而对于复杂数据类型,初始化语句不尽相同,例如结构体columninFo,和它的数组columninFo[]:columninFo.byReferencecol=newcolumninFo.byReference ();columninFo.byReference[]cols=newcolumninFo.byRefere nce[]{newcolumninFo.byReference()};这时可以通过判断数据类型是否带有”[]”来判断何种初始化方式:修改data.java:stringdatatypename=”columninFo.byReference[]”;context.put(“datatypena me”,datatypename);context.put(“dataname”,”cols”);context.put(“datatypelast”,datatypename.substring (datatypename.length-2,datatypename.length);//获取数据类型的最后两个字母context.put(“datatype”,datatypename.substring(0,d atatypename.length-2);//获取数据类型除去最后两个字母的字符串修改data.vm:#set($s1=$datatypename+”{new”+$datatype+”()};”)#set($s2=$datatypename+”();”)#if($datatypelast=”[]”)$datatypename$dataname=new$s1#else$datatyename$dataname=new$s2这样就可以完成初始化。
Java基础知识点归纳Java基础学问点归纳对于刚刚接触Java的人,java基础学问技术点繁多,那么yjbys我为大家汇总最全java学问点如下,仅供大家参考学习!1. JVM相关(包括了各个版本的特性)对于刚刚接触Java的人来说,JVM相关的学问不愿定需要理解很深,对此里面的概念有一些简洁的了解即可。
不过对于一个有着3年以上Java阅历的资深开发者来说,不会JVM几乎是不行接受的。
JVM作为java运行的基础,很难信任对于JVM一点都不了解的人可以把java 语言吃得很透。
我在面试有超过3年Java阅历的开发者的时候,JVM几乎就是一个必问的问题了。
当然JVM不是唯一确定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。
在JVM这个大类中,我认为需要把握的学问有:JVM内存模型和结构GC原理,性能调优调优:Thread Dump,分析内存结构class 二进制字节码结构,class loader 体系,class加载过程,实例创建过程方法执行过程:Java各个大版本更新提供的新特性(需要简洁了解)2. Java的运行(基础必备)这条可能出看很简洁,java程序的运行谁不会呢?不过很多时候,我们只是单纯通过IDE去执行java程序,底层IDE又是如何执行java程序呢?很多人并不了解。
这个学问点是最最基本的java开发者需要把握的,初学java,第一个确定是教你如何在指令行中执行java程序,但是很多人一旦把java学完了,IDE用上了,就把这个都忘了。
为什么强调要知道这个呢,知道了java最纯粹的启动方式之后,你才能在启动出问题的时候,去分析当时启动的名目多少,执行命名如何,参数如何,是否有缺失等。
这样有利于你真正开发中去解决那些奇诧异怪的可能和环境相关的问题。
在这里需要把握的学问有:javac 编译java文件为class 文件java 指令的使用,带package的java类如何在指令行中启动java程序涉及到的各个路径(classpath,java。
java的心得最新6篇优秀的心得体会必须结合自己的真实经历,才能让每一个字都充满情感与力量,经常撰写心得体会,有助于培养我们对事物的观察力和分析能力,本店铺今天就为您带来了java的心得最新6篇,相信一定会对你有所帮助。
java的心得篇1在本学期我们进行了为期三周的java实训。
回首本学期的java 学习,虽说时间很短,但其中的每一天都使我收获很大、受益匪浅,它不但极大地加深了我对一些理论知识的理解,不仅使我在理论上对java有了全新的认识,在实践能力上也得到了提高,真正地做到了学以致用,更学到了很多做人的道理,对我来说受益匪浅。
除此以外,我知道了什么叫团队,怎样和团队分工合作;同时我还学会了如何更好地与别人沟通,如何更好地去陈述自己的观点,如何说服别人认同自己的观点。
这也是第一次让我亲身感受到理论与实际的相结合,让我大开眼界。
也是对以前所学知识的一个初审吧!这次实训对于我以后学习、找工作也是受益匪浅的,在短短的三周中相信这些宝贵的经验会成为我今后成功的重要的基石;这对于我的学业,乃至我以后人生的影响无疑是极其深远的。
这次实训虽然是我们的第一次,心得体会不过同学们表现不错,由此看来,我们在进入大学的这几个月里学到了不少的专业知识,只是自己感觉不到而已。
对于所学专业,我们不能过于自卑和担忧,否则会妨碍自己学习。
实训是学习java的重要环节,有利于我们巩固专业知识、掌握工作技能,提高就业筹码。
我把本次为期三周的实训看作是理论与实践相结合的桥梁。
通过这周的实训和学习,我知道了此次实训的目的,也清楚目前自己的不足,那就是缺乏相应的知识与经验,对所学的专业知识不能够很好地运用于实践操作。
正所谓百闻不如一见,经过这次自身的切身实践,我才深切地理会到了走出课堂,投身实践的必要性。
平时,我们只能在课堂上与老师一起纸上谈兵,思维的认识基本上只是局限于课本的范围之内,也许就是这个原因就导致我们对专业知识认识的片面性,使得我们只知所以然,而不知其之所以然!限制了我们网络知识水平的提高。
深入理解java虚拟机(一)虚拟机内存划分Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区。
这些区域有不同的特性,起不同的作用。
它们有各自的创建时间,销毁时间。
有的区域随着进程的启动而创建,随着进程结束而销毁,有的则始终贯穿虚拟机整个生命周期。
Java虚拟机运行时内存区域主要分为七部分,分别是:程序计数器,Java虚拟机栈,本地方法栈,方法区,Java堆,运行时常量池,直接内存。
如上图所示(图片来源于网络):蓝色区域包裹的部分为运行时几个数据区域:白色的部分为线程私有的,既随着线程的启动而创建。
每个线程都拥有各自的一份内存区域。
它们是:JAVA栈(JAVA STACK),本地方法栈(NATIVE METHOD STACK),和程序计数器(PROGRAM COUNTER REGISTER)。
黄色部分是线程共享的,所有的线程共享该区域的内容。
他们是:方法区(METHOD AREA),堆(HEAP)。
我们分别来介绍这些区域。
(1)程序计数器(program counter register)学过计算机组成原理的都知道计算机处理器中的程序计数器。
当处理器执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。
与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。
此后经过分析指令,执行指令。
完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
处理器的程序计数器是指寄存器,而java程序计数器是指一小块内存空间。
java代码编译字节码之后,虚拟机会一行一行的解释字节码,并翻印成本地代码。
这个程序计数器盛放的就是当前线程所执行字节码的行号的指示器。
在虚拟机概念模型中,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等都依赖于它。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。
使⽤JavavisualVM监控远程JVM的流程分析VisualVM是JDK⾃带的⼀款全能型性能监控和故障分析⼯具,包括对CPU使⽤、JVM堆内存消耗、线程、类加载的实时监控,内存dump⽂件分析,垃圾回收运⾏情况的可视化分析等,对故障排查和性能调优很有帮助。
1 监控远程tomcat 对于被监控的tomcat,需要修改tomcat的bin⽬录下的Catalina.sh配置⽂件,增加如下配置。
JAVA_ OPTS="$JAVA_ OPTS -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=9004-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false.preferlPv4Stack=true-Djava.rmi.server.hostname=10.110.3.62" 其中9004,是远程主机的端⼝,10.110.3.62是远程主机的ip地址。
2 监控远程java程序 对于被监控的java程序,需要修改启动的参数,修改配置如下:nohup java -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=9004-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false.preferlPv4Stack=true-Djava.rmi.server.hostname=10.110.3.62 -jar hello.jar &3 Java VisualVM界⾯配置 ctrl + r 快捷键,运⾏ "jvisualvm"进⼊Java VisualVM界⾯,点击远程添加远程主机,输⼊远程主机的ip地址。
以下是一个Java学习的大纲,包括了Java基础知识、面向对象编程、异常处理、集合框架、多线程、网络编程和数据库操作等方面的内容。
1. Java基础知识- Java简介- Java开发环境搭建- Java基本语法-数据类型-运算符-控制结构(条件语句、循环语句)- Java变量和常量- Java注释- Java编码规范2. 面向对象编程-类和对象-类的定义和使用-对象的创建和使用-构造方法-析构方法- this关键字-封装-继承-多态-抽象类和接口3. 异常处理-异常的概念-异常的分类- try-catch语句- finally语句- throw和throws关键字-自定义异常4. 集合框架-集合框架概述- List、Set和Map接口及其实现类-迭代器(Iterator)和枚举器(Enumeration)-集合排序和查找-泛型5. 多线程编程-线程的概念-线程的创建和启动-线程同步(synchronized关键字)-线程间通信(wait、notify和notifyAll方法)-线程池(ThreadPoolExecutor类)-生产者消费者模式6. 网络编程-网络编程基础- InetAddress类和URL类- Socket编程-服务器端编程-客户端编程- UDP编程- HTTP协议和Java实现的HTTP客户端(HttpURLConnection类)7. 数据库操作- SQL语言基础(DDL、DML、DQL、DCL)- JDBC编程(DriverManager类、Connection、Statement、ResultSet类)- SQL注入攻击和防范- ORM框架(如Hibernate、MyBatis)8. Java Web开发- Servlet和JSP简介- Servlet生命周期-请求和响应对象(HttpServletRequest、HttpServletResponse)-会话管理(HttpSession)-过滤器(Filter)和监听器(Listener)- MVC设计模式-常用Java Web框架(如Spring、Struts2、Hibernate等)9. Java企业级应用开发- Java EE架构- EJB(Enterprise JavaBeans)- JPA(Java Persistence API)- JMS(Java Message Service)- RMI(Remote Method Invocation)- Java安全和权限控制10. Java性能优化和调试- Java内存模型和垃圾回收机制- JVM调优(如调整堆大小、新生代和老年代比例等)- Java代码性能分析工具(如VisualVM、JProfiler等)- Java代码调试技巧(如使用断点、单步执行等)11. Java新特性和发展趋势- Java 8的新特性(如Lambda表达式、Stream API等)- Java 9的新特性(如模块化系统等)- Java 10的新特性(如局部变量类型推断等)- Java 11的新特性(如HTTP客户端API改进等)- Java的未来发展趋势(如微服务、云原生应用等)12. Java测试-单元测试(JUnit)-集成测试-性能测试(JMeter)-代码覆盖率(JaCoCo)-持续集成和持续交付(Jenkins、Travis CI等)13. Java开发工具和环境-集成开发环境(IDE)(如Eclipse、IntelliJ IDEA等)-版本控制工具(如Git、SVN等)-构建工具(如Maven、Gradle等)-依赖管理工具(如Maven Repository、Nexus等)-容器化和云原生技术(如Docker、Kubernetes等)14. Java实战项目-在线购物系统-学生信息管理系统-企业资源计划(ERP)系统-社交媒体应用-物联网应用15. Java学习资源和社区- Java官方文档- Java教程和书籍- Java博客和论坛- Java开发者社区(如Stack Overflow、GitHub等)16. Java面试准备-面试技巧和注意事项- Java面试题库(如LeetCode、HackerRank等)-常见Java面试问题及答案-如何回答技术难题和编程问题-如何展示自己的项目经验和技能17. Java职业发展- Java程序员的职业规划-成为Java专家的途径- Java架构师的职责和技能要求- Java开发团队的管理和协作-创业和企业中Java技术的应用18. Java开源项目和社区贡献-了解Java开源项目(如Spring、Hibernate等)-参与Java开源项目的方式和流程-提交代码和解决bug的方法-与其他开发者合作的技巧-为Java社区做贡献的意义和方法。
java的基本概念Java的基本概念Java是一种高级编程语言,由Sun Microsystems于1995年推出,现在已被Oracle收购。
它是一种面向对象编程语言,适用于跨平台应用程序开发,因此广泛应用于Web、移动、桌面等各种领域。
在学习Java 编程之前,需要了解一些基本概念。
一、Java虚拟机(JVM)Java虚拟机是Java的重要组成部分之一,它是一个运行Java字节码的虚拟机,具有独立于硬件平台的特性。
JVM将Java字节码解释为机器指令,使Java程序能在各种操作系统上运行。
JVM还负责Java程序内存的分配和垃圾回收。
Java语言的安全性和可移植性也得益于JVM。
二、面向对象编程(OOP)Java是一种面向对象编程语言。
它的核心思想是将程序看作由对象组成,每个对象都有自己的属性和行为。
OOP的优点在于能够提高代码复用性,使得代码更易于扩展和维护,也有利于开发大型应用程序。
在Java中,所有的数据都是以对象的形式进行处理,常用的面向对象概念包括封装、继承和多态。
三、数据类型Java支持各种数据类型,包括基本数据类型和引用数据类型。
基本数据类型包括8种:byte、short、int、long、float、double、char和boolean,它们分别用于存储不同类型的数据。
引用数据类型包括类、接口、数组等类型。
Java还支持自动装箱和拆箱,即将基本数据类型自动转换为包装类型,方便代码的编写。
四、流程控制Java支持多种流程控制语句,包括顺序结构、选择结构和循环结构。
顺序结构是按照代码的顺序执行,选择结构根据条件选择不同的执行路径,循环结构则是重复执行同一个代码块。
Java还支持异常处理机制,即在程序运行时捕获异常并进行相应的处理,保证程序的健壮性和可靠性。
五、数组数组是Java中常用的数据结构之一。
它是一组固定大小的有序元素集合,可以存储同一类型的数据。
Java的数组可以是一维数组或多维数组,数组的下标从0开始计数。
java知识点难点总结Java作为一门流行的编程语言,有着广泛的应用领域和大量的开发者群体。
但是,对于初学者和甚至一些有经验的程序员来说,Java也存在着一些难点和陷阱。
本文将总结一些Java中的难点知识点,帮助读者更好地理解和掌握这门语言。
1. 异常处理Java中的异常处理是一个比较困扰程序员的难点。
在Java中,异常是一种程序运行时遇到的问题,如空指针异常、类找不到异常等。
在实际开发中,异常处理是必不可少的。
Java提供了try-catch-finally语句来处理异常,但是在实际项目中,异常可能会导致复杂的处理逻辑,需要程序员有着一定的经验和技巧来处理。
此外,Java也提供了throws和throw关键字来抛出异常和主动抛出异常,这也是初学者比较容易混淆的地方。
2. 多线程多线程是Java的一大特色,也是一大难点。
在Java中,可以通过继承Thread类或者实现Runnable接口来创建线程,但是线程的并发访问可能导致数据同步问题,需要使用synchronized关键字来解决。
而且在Java中,线程的调度、同步、死锁等问题也常常让程序员头疼。
3. 内存管理Java有自己的内存管理机制,但是并不是所有的程序员都能完全理解和掌握。
尤其是对于垃圾回收机制的工作原理和触发条件,大部分程序员只知道有垃圾回收,但是并不了解具体的内部实现。
了解垃圾回收机制对于程序员来说是非常重要的,可以避免内存泄漏和性能问题。
4. 集合框架Java提供了丰富的集合框架,如List、Set、Map等。
对于初学者来说,可能会感到困惑的是各种集合的使用场景和区别,以及集合框架的实现原理。
比如ArrayList和LinkedList的区别,或者HashMap和TreeMap的选择等。
5. 泛型泛型是Java中比较抽象和难理解的概念之一。
在Java中,泛型是一种参数化类型的概念,可以使得代码更加通用和安全。
但是对于一些初学者来说,可能会感到困惑的是泛型的通配符、类型擦除等问题。
java虚拟机学习
1.数据类型(基本类型、引用类型)====>数值本身、引用值
2.堆、栈=====>栈是运行时的单位(如何处理数据),堆是存储的单位(数据如何存储)
------栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序相关信息的。
包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。
在Java中,Main函数就是栈的起始点,也是程序的起始点。
堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用
3.Java中的参数传递时传值呢?还是传引用?
a)程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引
用的问题。
不会直接传对象本身。
b)Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用
c)堆和栈中,栈是程序运行最根本的东西。
程序运行可以没有堆,但是不能没有栈。
而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。
不过,正是因为堆
和栈的分离的思想,才使得Java的垃圾回收成为可能
4.Java对象的大小
a)一个空Object对象的大小是8byte(没有任何属性的对象)
b)Object ob = new Object();所占的空间为:4byte+8byte。
4byte是上面部分所说的Java
栈中保存引用的所需要的空间。
而那8byte则是Java堆中对象的信息.不论什么样
的Java对象,其大小都必须是大于8byte
c)Java在对对象内存分配时都是以8的整数倍来分,基本类型包装类的大小至少是
16byte
5.引用类型
a)对象引用类型分为强引用、软引用、弱引用和虚引用。
b)强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收
时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收
c)软引用:软引用一般被作为缓存来使用。
与强引用的区别是,软引用在垃圾回收时,
虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。
如果剩余内存比
较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进
行回收。
换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。
d)弱引用:弱引用与软引用类似,都是作为缓存来使用。
但与软引用不同,弱引用在
进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周
期内。
6.JVM调优总结(三)-基本垃圾回收算法
7.垃圾回收面临的问题
a)如何区分垃圾。
垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。
而
最简单的Java栈就是Java程序执行的main函数
b)如何处理碎片。
“复制”方式和“标记-整理”方式,都可以解决碎片的问题。
c)如何解决同时存在的对象创建和对象回收问题;在现有的垃圾回收方式中,要进行
垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回
收,回收完成后再继续应用
8.分代垃圾回收详述
a)为什么要分代:不同的对象的生命周期是不一样的。
因此,不同生命周期的对象可
以采取不同的收集方式,以便提高回收效率。
b)如何分代虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old
Generation)和持久代(Permanent Generation)。
其中持久代主要存放的是Java类
的类信息,与垃圾收集要收集的Java对象关系不大。
年轻代和年老代的划分是对
垃圾收集影响比较大的
c)什么情况下触发垃圾回收GC有两种类型:Scavenge GC(当新对象生成,并且在Eden
申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,
并且把尚且存活的对象移动到Survivor区)和Full GC(对整个堆进行回收)
9.典型配置举例
a)堆大小设置
b)回收器选择。
串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小
数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
10.垃圾回收的瓶颈
a)传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最
小,把应用的吞吐量推到了一个极限。
但是他无法解决的一个问题,就是Full GC
所带来的应用暂停
java线程安全总结
1.线程安全无非是要控制多个线程对某个资源的有序访问或修改
2.Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java
应用程序接口(Java API)。