In a nutshell JMX allows you to remotely invoke methods or view exposed data from the inside of a running JVM. A lot of applications use JMX to sort of attach a remote dashboard to their running JVMs in order to provide remote management.
For example, if you had an app server running on a machine, with JMX it would be possible to remotely view the exposed information about that server. It is also possible to code your own JMX MBeans which can expose any variables or methods inside your application. The exposed variables can then be "polled" remotely to test for certain conditions you would like to know about.
Another useful thing about JMX is that you can remotely change variables on the fly. For instance, if you have some sort of pool set up that has a maximum total amount, this maximum amount can be changed remotely without having to restart or change any configuration files on your application server.
jconsole
is provided by Sun with Java to be able to easily view your MBeans remotely without having to code your own client solution. You could also consume the MBeans with a custom solution which can give you excellent flexibility.
Also, there are already some monitoring software that come with JMX MBean monitoring built in. Zenoss and Applications Manager 8 do this, to name a couple.
Addition:
There is already a lot of software that takes advantage of JMX. Tomcat exposes information that is accessible via jconsole and so does JBoss Application Server.