JMS is a Java specification that defines a common way for Java programs to create and send messages asynchronously in a loosely coupled manner, ensuring reliable delivery. It uses providers to implement the messaging functionality and clients interact through connection factories, destinations, and sessions to send and receive messages either point-to-point through queues or publish-subscribe through topics. JMS can also be used with EJB message-driven beans and to transport SOAP messages over JMS.